美文网首页
Android--ItemTouchHelper基本用法

Android--ItemTouchHelper基本用法

作者: aruba | 来源:发表于2020-02-29 11:12 被阅读0次
    ItemTouchHelper是谷歌提供的用于实现Recyclerview 拖拽效果的帮助类,今天我们来学习下它的基本用法
    首先ItemTouchHelper需要实现它的一个内部抽象类CallBack
    public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
        private IMoveAndSwipeCallback iMoveAndSwipeCallback;
    
        public void setiMoveAndSwipeCallback(IMoveAndSwipeCallback iMoveAndSwipeCallback) {
            this.iMoveAndSwipeCallback = iMoveAndSwipeCallback;
        }
    
        /**
         * 设置拖拽和item滑动的可支持方向
         *
         * @param recyclerView
         * @param viewHolder
         * @return
         */
        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            //支持上下拖拽
            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            //item支持左滑
            final int swipeFlags = ItemTouchHelper.LEFT;
    
            return makeMovementFlags(dragFlags, swipeFlags);
        }
    
        /**
         * 拖拽结束后(手指抬起)会回调的方法
         * 
         * @param recyclerView
         * @param viewHolder 手指拖拽的item
         * @param viewHolder1 移动到的item
         * @return
         */
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
            if (iMoveAndSwipeCallback != null) {
                iMoveAndSwipeCallback.onMove(viewHolder.getAdapterPosition(), viewHolder1.getAdapterPosition());
            }
            return true;
        }
    
        /**
         * 侧滑回调
         * 
         * @param viewHolder
         * @param swipeDir 方向
         */
        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int swipeDir) {
            if (iMoveAndSwipeCallback != null) {
                iMoveAndSwipeCallback.onSwiped(viewHolder.getAdapterPosition());
            }
        }
    }
    
    主要用到三个方法,getMovementFlags方法用于确定支持的拖拽方向和侧滑方向,onMove方法是拖拽结束后(手指抬起)会回调的方法,onSwiped则是侧滑回调,我这边还用了一个接口来给外部调用监听onMove和onSwiped
    /**
     * 拖拽和侧滑抽象接口
     */
    public interface IMoveAndSwipeCallback {
        void onMove(int prePosition, int postPosition);
    
        void onSwiped(int position);
    }
    
    接下是我们在Activity中给RecyclerView设置ItemTouchHelper
    public class ItemTouchHelperActivity extends AppCompatActivity implements IMoveAndSwipeCallback {
        RecyclerView rv;
        private List<String> strings;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_item_touch_helper);
    
            rv = findViewById(R.id.rv);
            rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            rv.addItemDecoration(new MyDecoration(this, MyDecoration.HORIZONTAL_LIST));
    
            initData();
            MyAdapter myAdapter = new MyAdapter(this);
            rv.setAdapter(myAdapter);
    
            //给RecyclerView设置ItemTouchHelper
            ItemTouchHelperCallback itemTouchHelperCallback = new ItemTouchHelperCallback();
            itemTouchHelperCallback.setiMoveAndSwipeCallback(this);
            ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
            itemTouchHelper.attachToRecyclerView(rv);
        }
    
        private void initData() {
            strings = new ArrayList<>();
            for (int i = 0; i < 20; i++) {
                strings.add(String.valueOf(i));
            }
        }
    
        @Override
        public void onMove(int prePosition, int postPosition) {
            Collections.swap(strings, prePosition, postPosition);
            if (rv.getAdapter() != null) {
                rv.getAdapter().notifyItemMoved(prePosition, postPosition);
            }
        }
    
        @Override
        public void onSwiped(int position) {
            strings.remove(position);
            if (rv.getAdapter() != null) {
                rv.getAdapter().notifyItemRemoved(position);
            }
        }
    
        class MyAdapter extends RecyclerView.Adapter {
            private Context context;
    
            public MyAdapter(Context context) {
                this.context = context;
            }
    
            @NonNull
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_text, viewGroup, false));
            }
    
            @Override
            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
                MyViewHolder myViewHolder = (MyViewHolder) viewHolder;
                myViewHolder.tv.setText(strings.get(i));
            }
    
            @Override
            public int getItemCount() {
                return strings.size();
            }
    
            class MyViewHolder extends RecyclerView.ViewHolder {
                public TextView tv;
    
                public MyViewHolder(@NonNull View itemView) {
                    super(itemView);
                    tv = itemView.findViewById(R.id.tv);
                }
            }
        }
    }
    
    最后效果:
    ItemTouchHelper.gif
    项目地址:https://gitee.com/aruba/RecyclerViewApplication.git

    相关文章

      网友评论

          本文标题:Android--ItemTouchHelper基本用法

          本文链接:https://www.haomeiwen.com/subject/foeuhhtx.html