欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RecylerView全简析之仿支付宝侧滑删除和拖动排序

程序员文章站 2022-06-01 15:05:34
...

RecylerView全简析之仿支付宝侧滑删除和拖动排序

ItemTouchHelper

 //条目的一些拖动触摸的工具类
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
            @Override
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                //获取触摸的方向,包含两个参数  1.拖动dragFlags 2.侧滑删除swipeFlags
                //代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT
                int swipeFlages = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
                //不做处理默认为0
                int dragFlags=0;
                if(recyclerView.getLayoutManager() instanceof GridLayoutManager){
                    dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                }else{
                    dragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT ;
                }
                return makeMovementFlags(dragFlags, swipeFlages);
            }

            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                //状态发生变化  拖动改变    侧滑状态    正常状态
                if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
                    //设置高亮
                    viewHolder.itemView.setBackgroundColor(Color.YELLOW);
                }

            }

            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                 //一定要刷新数据      当你拖动完毕后mData数据已经改变
                mAdapter.notifyDataSetChanged();
                //动画执行完毕,恢复
                viewHolder.itemView.setBackgroundColor(Color.parseColor("#ECECEC"));
                //显示列表侧滑删除之后有些条目不出来(可以看Google的源码)
                // 侧滑和拖动其实都是使用的ViewCompat这一个类
                ViewCompat.setTranslationX(viewHolder.itemView,0);

            }


            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {


                //获取原来的位置
                int fromPosition = viewHolder.getAdapterPosition();
                //获取目标的位置
                int targetPosition = target.getAdapterPosition();
                //替换
                mAdapter.notifyItemMoved(fromPosition, targetPosition);
                Log.e("TAG", fromPosition + "======>" + targetPosition);
                //数据没有发生变化(mDatas中数据)
                if (fromPosition > targetPosition) {//1>0
                    for (int i = fromPosition; i > targetPosition; i--) {//向上移动
                        Collections.swap(mDatas, i, i - 1);//向前移动
                        //改变实体集中的数据

                    }
                } else {//  2 ->5
                    for (int i = fromPosition; i < targetPosition; i++) {//向下拖拽
                        Collections.swap(mDatas, i, i + 1);//向后移

                    }
                }
                //mAdapter.notifyDataSetChanged();
                //测试数据实体集是否改变
                for (String mData : mDatas) {
                    Log.e("TAG", mData);
                }

                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

                // 侧滑删除执行完毕,需要移除,或者更新Adapter
                int currentSwipePosition = viewHolder.getAdapterPosition();//当前要移除的位置

                //这样没有动画
                //mDatas.remove(currentSwipePosition);
                //mAdapter.notifyDataSetChanged();
                mAdapter.notifyItemRemoved(currentSwipePosition);
                // 数据对应的也移除
                mDatas.remove(currentSwipePosition);


            }
        });
        itemTouchHelper.attachToRecyclerView(mRecyclerView);
相关标签: RecylerView