RecyclerView实现拖拽

效果图:
Android RecyclerView拖拽与左右滑动删除_第1张图片
相关介绍:
ItemTouchHelper:
官方介绍ItemTouchHelper是一个支持对RecyclerView实现拖拽和滑动消失的工具类
Android RecyclerView拖拽与左右滑动删除_第2张图片
这里主要看一下它的使用,构造器跟方法应该一看就明白了,创建的时候需要传入ItemTouchHelper.CallBack,关于ItemTouchHelper.CallBack的介绍下面也有。
Android RecyclerView拖拽与左右滑动删除_第3张图片
ItemTouchHelper.CallBack:
下面是ItemTouchHelper.CallBack的官方介绍:
Android RecyclerView拖拽与左右滑动删除_第4张图片
先看下第二个红框中的内容:
为了控制你想操作的每一个view,你应该重写 getMovementFlags(RecyclerView, ViewHolder)方法并返回设置的一些方向标识((LEFT, RIGHT, START, END, UP, DOWN)),你可以使用 makeMovementFlags(int, int)来很简单的构造它。这里我们来看下makeMovementFlags()方法。看方法的注释,可以看出如果想垂直的拖拽和从左边滑动消失你可以调用该方法。返回值(makeMovementFlags(UP | DOWN, LEFT);
Android RecyclerView拖拽与左右滑动删除_第5张图片
继续看第三部分红框:
如果用户拖拽一个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给出的使用方式。
Android RecyclerView拖拽与左右滑动删除_第6张图片

思路:
使用了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);

更多相关文章

  1. Android提交数据到服务的四种方法!!!
  2. [转载]android—OpenGL—GL10方法解析(转载)
  3. Android实现在xml文件中引用自定义View的方法分析
  4. Android 子线程更新UI的几种方法
  5. android加载字体内存泄漏的处理方法
  6. Android位置策略(二)
  7. Android Studio运行main方法报错 SourceSet with name ‘main‘
  8. 谷歌开发工具android studio启动不了的解决方法

随机推荐

  1. Android开发艺术探索——第二章:IPC机制(上
  2. Android实现退出时关闭所有Activity的方
  3. Android(安卓)8.0目录介绍
  4. Android(安卓)- 多线程 - AsyncTask
  5. #Android源代码#android:onClick属性的底
  6. 详解Android(安卓)TextView属性ellipsize
  7. 配置并使用Android支持的库
  8. android 传感器使用与开发----方向传感器
  9. Android(安卓)开发学习 HelloAndroid例子
  10. android解析xml文件的方式