频道栏目
首页 > 资讯 > 其他 > 正文

使用RecyclerView实现拖曳移动和滑动删除功能

17-12-02        来源:[db:作者]  
收藏   我要投稿

使用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 滑动删除有删除的按钮,点击了才删除

相关TAG标签
上一篇:移动开发Retrofit+EventBus+GreenDao+MVP简单小总结
下一篇:C#编程之git操作讲解
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站