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

RecyclerView的使用(二)——拖曳移动和滑动删除

程序员文章站 2022-05-12 09:19:14
...

RecyclerView的使用(二)——拖曳移动和滑动删除


1 先获取屏幕的宽度

//声明
private int screenwidth;
 //oncreate中
 //获取屏幕宽度
        WindowManager wm = (WindowManager) MainActivity.this
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        screenwidth =outMetrics.widthPixels;

        itemMoveAndDelete();

2 使用

//设置item可移动可滑动删除

    private void itemMoveAndDelete(){
        // 创建类对象    callback为监听
        itemTouchHelper=new ItemTouchHelper(new ItemTouchHelper.Callback(){

                // 重写下面的方法

                //用于设置拖拽和滑动的方向
                @Override
                public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                    // 拖动方向为上或者下
                    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                    // 滑动方向为左或者右    //swipeFlags设置为0的话item不滑动
                    int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
                    return makeMovementFlags(dragFlags,swipeFlags);
                }

                //长摁item拖拽时会回调这个方法
                @Override
                public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

                    int from=viewHolder.getAdapterPosition();
                    int to=target.getAdapterPosition();
                        // 要实现数据的移除

                    mAdapter.notifyItemMoved(from,to);//更新适配器中item的位置
                    return true;
                }


                @Override
                public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                    //这里处理滑动删除  
    mAdapter.removeItem(viewHolder.getAdapterPosition());

                    // 将该行的数据从数据库删除出去
                    // 首先获取该position的位置
                    int a =viewHolder.getAdapterPosition();
                    // 然后根据该位置 去获得该位置的name的textView
                    View view = mLayoutManager.findViewByPosition(a);
                    LinearLayout layout = (LinearLayout)view;
                    TextView status =  layout.findViewById(R.id.text_1);
                    String str = status.getText().toString();
                    // 再调用数据库删除方法去删除这个name的行
                    delete(str);
                // 也可以对List的数据删除
                 mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
                }

                //返回true则为所有item都设置可以拖拽 要想约束某些item不能拖曳 则设置为false 并在长按点击事件中设置
                // itemTouchHelper.startDrag(recyclerview.getChildViewHolder(view));
                @Override
                public boolean isLongPressDragEnabled() {
                    return true;
                }
            // 以下为拖曳动画效果
            //当item拖拽开始时调用 并且得到的这个颜色item不会变回去 得在item拖曳结束的方法中改回去
            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                super.onSelectedChanged(viewHolder, actionState);
                if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){
                    //可以用int形式的color 也可以用string类型的 但是要转换为int类型
                    viewHolder.itemView.setBackgroundColor(Color.parseColor("#FF6347"));//拖拽时设置背景色为灰色
                }
            }

            //当item拖拽完成时调用
            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                viewHolder.itemView.setBackgroundColor(Color.parseColor("#00000000"));//拖拽停止时设置背景色为透明
            }

            //当item视图变化时调用 即被左右滑动时
            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
                //根据item滑动偏移的值修改item透明度。screenwidth是我提前获得的屏幕宽度
                viewHolder.itemView.setAlpha(1-Math.abs(dX)/screenwidth);
            }

            });
            // itemTouchHelper需要与recyclerView绑定才有效果,在recyclerView初始化的时候调用
        itemTouchHelper.attachToRecyclerView(mRecyclerView);

        }

尚存在的问题:
1 移除的时候,移除的行会放到最后一行,并且值被更新为固定的一个值
不过重启该行会消失
2 拖曳的时候,数据没有进行移动
待完善:
1 滑动删除有删除的按钮,点击了才删除


参考:
http://www.jianshu.com/p/12ec590f6c76