Android RecyclerView拖拽与左右滑动删除
RecyclerView实现拖拽
效果图:
相关介绍:
ItemTouchHelper:
官方介绍ItemTouchHelper是一个支持对RecyclerView实现拖拽和滑动消失的工具类
这里主要看一下它的使用,构造器跟方法应该一看就明白了,创建的时候需要传入ItemTouchHelper.CallBack,关于ItemTouchHelper.CallBack的介绍下面也有。
ItemTouchHelper.CallBack:
下面是ItemTouchHelper.CallBack的官方介绍:
先看下第二个红框中的内容:
为了控制你想操作的每一个view,你应该重写 getMovementFlags(RecyclerView, ViewHolder)方法并返回设置的一些方向标识((LEFT, RIGHT, START, END, UP, DOWN)),你可以使用 makeMovementFlags(int, int)来很简单的构造它。这里我们来看下makeMovementFlags()方法。看方法的注释,可以看出如果想垂直的拖拽和从左边滑动消失你可以调用该方法。返回值(makeMovementFlags(UP | DOWN, LEFT);
)
继续看第三部分红框:
如果用户拖拽一个item,ItemToucheHelper将会回调onMove(recyclerView, dragged, target)方法,你应该将item从旧的位置(dragged.getAdapterPosition())移动到新的位置(target.getAdapterPosition())并且在你的adaper中还需要调用 notifyItemMoved(int, int).方法,
通过上面的介绍与说明,可以知道如果我们想要实现拖拽与滑动,需要至少重写三个方法:
getMovementFlags()方法
onMove()方法
onSwiped()方法
所以在下面的代码中我们编写了一个类来继承ItemTouchHelper.CallBack并重写其中的这三个方法。
ItemTouchHelper.SimpleCallback:
ItemTouchHelper.SimpleCallback是ItemTouchHelper.CallBack的子类,作用与CallBack相同只是使用起来更加方便,具体使用方式可以参考API给出的使用方式。
思路:
使用了ItemTouchHelper类以及它的CallBack回调类。在ItemTouchHelper类中可以看到有一个通过 attachToRecyclerView();方法绑定RecyclerView,在创建ItemTouchHelper时会传一个CallBack参数。所以单独编写了一个ItemTouchHelperCallBack的类继承ItemTouchHelper.Callback实现其中的三个方法。在自己创建的ItemTouchHelperCallBack中写了一个接口进行回调。
代码分析:
继承ItemTouchHelper.Callback的ItemCallBack类会重写一下三个方法。
@Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { return ; } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { }
主要部分的具体代码
ItemTouchHelperCallBack
public class ItemTouchHelperCallBack extends ItemTouchHelper.Callback { //返回拖拽的方向和滑动的方向 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragflag = ItemTouchHelper.UP | ItemTouchHelper.DOWN|ItemTouchHelper.START | ItemTouchHelper.END; int swipeflag = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(dragflag,swipeflag); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder dragged, RecyclerView.ViewHolder target) { //用于接口回调 callBack.onMoved(dragged.getAdapterPosition(), target.getAdapterPosition()); return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { callBack.onSwipe(viewHolder.getAdapterPosition()); } InnerCallBack callBack; public void setInnerCallBack(InnerCallBack callBack) { this.callBack = callBack; } //内部接口 public interface InnerCallBack { void onMoved(int dragged, int target); void onSwipe(int direction); }}
Adapter
public class RecycleViewDemoAdapter extends RecyclerView.Adapter<RecycleViewDemoAdapter.MyViewHoler> implements ItemTouchHelperCallBack.InnerCallBack { private List mDatas; private Context mContext; private int[] colors=new int[]{Color.RED,Color.BLUE,Color.YELLOW,Color.GREEN}; public RecycleViewDemoAdapter(List mDatas, Context mContext) { this.mDatas = mDatas; this.mContext = mContext; } @Override public MyViewHoler onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(mContext).inflate(R.layout.recyclerviewdemo_item,parent,false); MyViewHoler vh=new MyViewHoler(view); return vh; } @Override public void onBindViewHolder(MyViewHoler holder, int position) { holder.iv.setImageResource(mDatas.get(position).getId()); holder.tv.setText(mDatas.get(position).getName()); //new Random().nextInt(4)产生0-3的随机数 holder.linearLayout.setBackgroundColor(colors[new Random().nextInt(4)]); } @Override public int getItemCount() return mDatas.size(); } /** * 传递旧的移动位置和新的位置,并调用Adapter的notifyItemMoved方法 * @param dragged * @param target */ @Override public void onMoved(int dragged, int target) { notifyItemMoved(dragged,target); } /** * 传递滑动删除的item并调用notifyItemRemoved方法 * @param direction */ @Override public void onSwipe(int direction) { mDatas.remove(direction);//删除数据,不然会继续占有位置 notifyItemRemoved(direction); } class MyViewHoler extends RecyclerView.ViewHolder{ ImageView iv; TextView tv; LinearLayout linearLayout; public MyViewHoler(View itemView) { super(itemView); iv= (ImageView) itemView.findViewById(R.id.fruit_iv); tv= (TextView) itemView.findViewById(R.id.fruitname_tv); linearLayout= (LinearLayout) itemView.findViewById(R.id.fruit_bg); } }}
Activity
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); initdata(); mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false)); mAdapter = new RecycleViewDemoAdapter(mFruits,getApplicationContext()); mRecyclerView.setAdapter(mAdapter); ItemTouchHelperCallBack callback=new ItemTouchHelperCallBack(); callback.setInnerCallBack(mAdapter); ItemTouchHelper helper=new ItemTouchHelper(callback); helper.attachToRecyclerView(mRecyclerView);
更多相关文章
- Android提交数据到服务的四种方法!!!
- [转载]android—OpenGL—GL10方法解析(转载)
- Android实现在xml文件中引用自定义View的方法分析
- Android 子线程更新UI的几种方法
- android加载字体内存泄漏的处理方法
- Android位置策略(二)
- Android Studio运行main方法报错 SourceSet with name ‘main‘
- 谷歌开发工具android studio启动不了的解决方法