package cn.k12cloud.k12cloud2cv3.adapter.base;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.k12cloud.k12cloud2cv3.adapter.holder.BaseViewHolder;
import cn.k12cloud.k12cloud2cv3.adapter.inter.OnItemClickListener;
/**
* Created by jiang on 12/3/15.
*/
public abstract class BaseAdapter extends RecyclerView.Adapter<BaseViewHolder> {
private OnItemClickListener onItemClickListener;
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
BaseViewHolder holder = new BaseViewHolder(LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false));
return holder;
}
@Override
public void onBindViewHolder(BaseViewHolder holder, final int position) {
if (onItemClickListener != null) {
holder.getmConvertView().setClickable(true);
holder.getmConvertView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(position);
}
});
}
onBindView(holder, position);
}
protected abstract void onBindView(BaseViewHolder holder, int position);
@Override
public int getItemViewType(int position) {
return getLayoutID(position);
}
protected abstract int getLayoutID(int position);
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
package cn.k12cloud.k12cloud2cv3.adapter;
import java.util.List;
import cn.k12cloud.k12cloud2cv3.adapter.base.BaseAdapter;
import cn.k12cloud.k12cloud2cv3.adapter.holder.BaseViewHolder;
/**
* Created by jiang on 12/3/15.
*/
public abstract class NormalAdapter<M> extends BaseAdapter {
protected List<M> mLists;
protected int layoutID;
private boolean isNeedFoot;
public static final int TYPE_ITEM = 2;
public static final int TYPE_FOOT = 3;
public NormalAdapter(List<M> mLists, int layoutID) {
this.mLists = mLists;
this.layoutID = layoutID;
}
private boolean isFootPosition(int position) {
if (isNeedFoot) {
if (position == getItemCount() - 1) {
return true;
}
}
return false;
}
protected abstract void onBindView(BaseViewHolder holder, int position);
@Override
protected int getLayoutID(int position) {
return layoutID;
}
public void notifyWithNextPage(int nextPage) {
setLastPage(nextPage);
this.notifyDataSetChanged();
}
public void setLastPage(Integer nextPage) {
if (nextPage == -1) {
this.isNeedFoot = true;
} else {
this.isNeedFoot = false;
}
}
@Override
public int getItemCount() {
int count = mLists.size();
if (isNeedFoot) {
return count + 1;
}
return count;
}
}
package cn.k12cloud.k12cloud2cv3.adapter.holder;
import android.support.annotation.IdRes;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
/**
* Created by jiang on 12/3/15.
*/
public class BaseViewHolder extends RecyclerView.ViewHolder {
protected final SparseArray<View> mViews;
protected View mConvertView;
public BaseViewHolder(View itemView) {
super(itemView);
mViews = new SparseArray<>();
mConvertView = itemView;
}
/**
* 通过控件的Id获取对应的控件,如果没有则加入mViews,则从item根控件中查找并保存到mViews中
*
* @param viewId
* @return
*/
public <T extends View> T getView(@IdRes int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getmConvertView() {
return mConvertView;
}
}
package Utils.OnListener;
/**
* Created by jiang on 12/3/15.
*/
public interface OnItemClickListener {
void onItemClick(int position);
}
package Utils.OnListener;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by GZY on 16/5/18.
*/
public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private GestureDetectorCompat gestureDetectorCompat;
private RecyclerView recyclerView;
public OnRecyclerItemClickListener(RecyclerView recyclerView) {
this.recyclerView = recyclerView;
gestureDetectorCompat = new GestureDetectorCompat(recyclerView.getContext(), new ItemTouchHelperGestureListener());
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
gestureDetectorCompat.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
gestureDetectorCompat.onTouchEvent(e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public abstract void onItemClick(RecyclerView.ViewHolder vh);
public abstract void onLongClick(RecyclerView.ViewHolder vh);
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null) {
RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);
onItemClick(vh);
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null) {
RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);
onLongClick(vh);
}
}
}
}
package test.gzy.qqtest.RecyclerView;
import android.app.Service;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import test.gzy.qqtest.Utils.Adapter.BaseViewHolder;
import test.gzy.qqtest.Utils.Adapter.NormalAdapter;
import test.gzy.qqtest.Utils.OnListener.OnRecyclerItemClickListener;
import test.gzy.qqtest.R;
/**
* Created by GZY on 16/5/18.
*/
public class RecyclerViewTestActivity extends AppCompatActivity {
public RecyclerView recyclerView;
public ArrayList<String> lists;
public String[] datas = new String[]{"苹果", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉"};
public NormalAdapter adapter;
public ItemTouchHelper itemTouchHelper;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_test);
initView();
initData();
setRecyclerView();
}
public void initView() {
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
}
public void initData() {
lists = new ArrayList<>();
for (int i = 0; i < datas.length; i++) {
lists.add(datas[i]);
}
}
public void setRecyclerView() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
linearLayoutManager.setAutoMeasureEnabled(true);
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new NormalAdapter(lists, R.layout.item_recyclerviewtest) {
@Override
protected void onBindView(BaseViewHolder holder, int position) {
TextView textView = holder.getView(R.id.item_recycler_tv);
textView.setText(lists.get(position));
}
};
// //第一种Item点击事件
// adapter.setOnItemClickListener(new OnItemClickListener() {
// @Override
// public void onItemClick(int position) {
// Snackbar.make(recyclerView, position + "", Snackbar.LENGTH_SHORT).show();
// }
// });
recyclerView.setAdapter(adapter);
//第二种Item点击事件
recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(recyclerView) {
@Override
public void onItemClick(RecyclerView.ViewHolder vh) {
Snackbar.make(recyclerView, vh.getLayoutPosition() + "", Snackbar.LENGTH_SHORT).show();
}
@Override
public void onLongClick(RecyclerView.ViewHolder vh) {
//如果item不是最后一个,则执行拖拽
if (vh.getLayoutPosition() != lists.size() - 1) {
itemTouchHelper.startDrag(vh);
}
}
});
/**
* 拖拽
*/
// ItemTouchHelper会在拖拽的时候回调Callback中相应的方法,我们只需在Callback中实现自己的逻辑就可以了。
itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
//ItemTouchHelper会在拖拽的时候回调Callback中相应的方法,我们只需在Callback中实现自己的逻辑就可以了。
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
final int dragFlags;
final int swipeFlags;
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
swipeFlags = 0;
} else {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//注意⚠当设置了滑动删除时要换成下面那句
// swipeFlags = 0;
swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
}
//获取系统震动服务
Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
// 震动70毫秒
vib.vibrate(70);
return makeMovementFlags(dragFlags, swipeFlags);
}
//dragFlags 是拖拽标志,swipeFlags是滑动标志,我们把swipeFlags 都设置为0,暂时不考虑滑动相关操作。
/**
* 滑动
* @param recyclerView
* @param viewHolder
* @param target
* @return
*/
//如果我们设置了相关的dragFlags,那么当我们长按item的时候就会进入拖拽并在拖拽过程中不断回调onMove()方法,
// 我们就在这个方法里获取当前拖拽的item和已经被拖拽到所处位置的item的ViewHolder,有了这2个ViewHolder,
// 我们就可以交换他们的数据集并调用Adapter的notifyItemMoved方法来刷新item。
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//得到拖动的 ViewHolder的Position
int fromPosition = viewHolder.getAdapterPosition();
//得到目标ViewHolder的position
int toPosition = target.getAdapterPosition();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(lists, i, i + 1);//改变实际的数据集
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(lists, i, i - 1);//改变实际的数据集
}
}
adapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
/**
* 侧滑删除
* @param viewHolder
* @param direction
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
adapter.notifyItemRemoved(position);
lists.remove(position);
}
/**
* 高亮
* @param viewHolder
* @param actionState
*/
//到这里,已经可以拖拽了,基本的效果如下:
//但是拖拽的时候我们拖拽的对象不能高亮显示,这是不友好的,我们希望拖拽的Item在拖拽的过程中背景颜色加深,这样就需要继续重写下面两个方法:
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(0);
}
//OK,这样就完成了Item的拖拽排序,简单看下现在的效果:
/**
* 设置每个item不可以被点击
*/
@Override
public boolean isLongPressDragEnabled() {
return false;
}
});
itemTouchHelper.attachToRecyclerView(recyclerView);
}
}
activity_recycler_test:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
item_recyclerviewtest:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/item_recycler_tv"
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:text="123456" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:background="@android:color/darker_gray" />
</LinearLayout>