美文网首页
实现RecyclerView中item条目上下交换位置和左滑删除

实现RecyclerView中item条目上下交换位置和左滑删除

作者: 清风兑酒 | 来源:发表于2019-05-04 18:55 被阅读0次
    移动条目
    1、TouchCallBack接口
    public interface TouchCallBack {
        //交换条目位置
        void onItemMove(int fromPosition,int toPosition);
        //删除条目
        void onItemDelete(int position);
    }
    
    2、SimpleItemTouchCallBack类
    import android.support.annotation.NonNull;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.helper.ItemTouchHelper;
    
    public class SimpleItemTouchCallBack extends ItemTouchHelper.Callback{
    
        private TouchCallBack mCallBack;
        //左滑删除的
        private boolean mSwipeEnable = true;
    
        public SimpleItemTouchCallBack(TouchCallBack mCallBack) {
            this.mCallBack = mCallBack;
        }
    
        /**
         * 返回可以滑动的方向,一般使用makeMovementFlags(int,int)
         * 或makeFlag(int, int)来构造我们的返回值
         * @param recyclerView
         * @param viewHolder
         * @return
         */
        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
    
            //允许上下拖拽
            int drag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            //允许向左滑动
            int swipe = ItemTouchHelper.LEFT;
            //设置
            return makeMovementFlags(drag,swipe);
        }
    
        /**
         * 上下拖动item时回调,可以调用Adapter的notifyItemMoved方法来交换两个ViewHolder的位置,
         * 最后返回true,
         * 表示被拖动的ViewHolder已经移动到了目的位置
         * @param recyclerView
         * @param viewHolder
         * @param target
         * @return
         */
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            //通知适配器,两个子条目位置发生改变
            mCallBack.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
            return true;
        }
    
        /**
         * 当用户左右滑动item时达到删除条件就会调用,一般为一半,条目继续滑动删除,否则弹回
         * @param viewHolder
         * @param direction
         */
        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            mCallBack.onItemDelete(viewHolder.getAdapterPosition());
        }
    
        /**
         * 支持长按拖动,默认是true
         * @return
         */
        @Override
        public boolean isLongPressDragEnabled() {
            return super.isLongPressDragEnabled();
        }
    
        /**
         * 支持滑动,即可以调用到onSwiped()方法,默认是true
         * @return
         */
        @Override
        public boolean isItemViewSwipeEnabled() {
            return mSwipeEnable;
        }
    
        /**
         * 设置是否支持左滑删除
         * @param enable
         */
        public void setmSwipeEnable(boolean enable) {
            this.mSwipeEnable = enable;
        }
    }
    
    3.在Activity中
    /**
     * homeSpecialRecyclerViewAdapter  RecyclerView 的适配器
     * recyclerview                    RecyclerView 控件
    */
    // 拖拽移动和左滑删除
    SimpleItemTouchCallBack simpleItemTouchCallBack = new SimpleItemTouchCallBack(homeSpecialRecyclerViewAdapter);
    // 要实现侧滑删除条目,把 false 改成 true 就可以了
    simpleItemTouchCallBack.setmSwipeEnable(false);
    ItemTouchHelper helper = new ItemTouchHelper(simpleItemTouchCallBack);
    helper.attachToRecyclerView(recyclerview);
    
    4、使 RecyclerView 的适配器实现 TouchCallBack 接口
    /**
    * goldTitleBeans 适配器里的数据集合
    */
    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        //交换集合中两个数据的位置
        Collections.swap(goldTitleBeans,fromPosition,toPosition);
        //刷新界面,局部刷新,索引会混乱
        notifyItemMoved(fromPosition,toPosition);
    }
    
    @Override
    public void onItemDelete(int position) {
        goldTitleBeans.remove(position);
        //局部刷新,索引会混乱+集合越界
        notifyItemRemoved(position);
    }
    

    相关文章

      网友评论

          本文标题:实现RecyclerView中item条目上下交换位置和左滑删除

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