RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序

1.概述


  这是春节前的最后一篇分享技术的博客了,接下来的时间需要去完善视频讲解,至于今年都干了哪些事有什么成就吹牛的这里就不多说了,声明一下图片资源我是盗用的别人的。这是最后一期分享RecyclerView了,我们直接看这一期需要分享的效果:
  
  这里写图片描述
  
  
  视频讲解http://pan.baidu.com/s/1jIlwl4E

  相关文章:
  
  RecyclerView更全解析之 - 基本使用和分割线解析
  
  RecyclerView更全解析之 - 打造通用的万能Adapter
  
  RecyclerView更全解析之 - 为它优雅的添加头部和底部
  
  RecyclerView更全解析之 - 打造通用的下拉刷新上拉加载
  
  RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序
  

2.基本思路 


  前面我们一直都是围着RecyclerView在转,发现这个控件让我们是又爱又恨,通过这几期的分享或者说是封装应该已经让我们喜欢上它了,那么今天我们在来看一个如此神奇的功能。我记得当初在做ListView的拖动排序的时候在网上找了各种资料,代码量还真不是一丁点,现在我们来看一下RecyclerView的拖动排序和侧滑删除需要怎么去实现,告诉你只需要简简单单的几行代码。
  实现这么个功能我们不需要再去继承RecyclerView,只需要去了解ItemTouchHelper这个类即可,接下来我们就去看看都有些什么。

3.基本实现 


  3.1 实现侧滑删除
  ItemTouchHelper这是google给我们写好的,专门用来处理Touch相关的一个类,我们先来实现一个简单的功能侧滑删除,先上代码再解释:

        // 实现左边侧滑删除
        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 swipeFlags = ItemTouchHelper.LEFT;

                // 拖动暂不处理默认是0
                return makeMovementFlags(0, swipeFlags);
            }

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

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

            }
        });
        // 这个就不多解释了,就这么attach
        itemTouchHelper.attachToRecyclerView(mRecyclerView);

 
 ItemTouchHelper.Callback 默认需要实现三个方法:

  • getMovementFlags() 获取Touch的响应方向,包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags,都可以是上下左右,上面事例没有处理拖动所以传的是0,侧滑给的是ItemTouchHelper.LEFT,所以待会效果是向左滑动删除;

  • onMove() 拖动的时候会不断的回调这个方法,拖动的时候肯定需要不断的更新列表数据,达到一边拖动列表不断更新当前数据;

  • onSwiped() 侧滑删除之后的回调方法。
      

这里写图片描述

目前的效果可以侧滑删除但是发现列表不更新,而且侧滑的时候不高亮,当然如果你不想要高亮那就不处理,再来改改:

        // 实现左边侧滑删除
        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 swipeFlags = ItemTouchHelper.LEFT;

                // 拖动暂不处理默认是0
                return makeMovementFlags(0, swipeFlags);
            }

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            /**
             * 侧滑删除后会回调的方法
             */
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                // 获取当前删除的位置
                int position = viewHolder.getAdapterPosition();
                mItems.remove(position);
                // adapter 更新notify当前位置删除
                mAdapter.notifyDataSetChanged();
            }

            /**
             * 拖动选择状态改变回调
             */
            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
                    // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了
                    // 侧滑或者拖动的时候背景设置为灰色
                    viewHolder.itemView.setBackgroundColor(Color.GRAY);
                }
            }

            /**
             * 回到正常状态的时候回调
             */
            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                // 正常默认状态下背景恢复默认
                viewHolder.itemView.setBackgroundColor(0);
            }
        });
        // 这个就不多解释了,就这么attach
        itemTouchHelper.attachToRecyclerView(mRecyclerView);

 这里写图片描述

3.2 实现拖动排序
  上面有两个方法onSelectedChanged(),clearView()不做过多的介绍,接下来实现拖动排序,还是我们在上面的代码基础山做一下修改,需要修改两个方法:
  getMovementFlags() 的dragFlags参数不能传0了,侧滑的时候没处理现在需要处理一下了;
  onMove() 在拖动的时候不断的回调改变列表的位置,不光要改变位置还要不断的改变数据集合的列表。

        // 实现左边侧滑删除 和 拖动排序
        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 swipeFlags = ItemTouchHelper.LEFT;


                // 拖动
                int dragFlags = 0;
                if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
                    // GridView 样式四个方向都可以
                    dragFlags = ItemTouchHelper.UP | ItemTouchHelper.LEFT |
                            ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT;
                } else {
                    // ListView 样式不支持左右,只支持上下
                    dragFlags = ItemTouchHelper.UP |
                            ItemTouchHelper.DOWN;
                }

                return makeMovementFlags(dragFlags, swipeFlags);
            }

            /**
             * 拖动的时候不断的回调方法
             */
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                // 获取原来的位置
                int fromPosition = viewHolder.getAdapterPosition();
                // 得到目标的位置
                int targetPosition = target.getAdapterPosition();
                if (fromPosition > targetPosition) {
                    for (int i = fromPosition; i < targetPosition; i++) {
                        Collections.swap(mItems, i, i + 1);// 改变实际的数据集
                    }
                } else {
                    for (int i = fromPosition; i > targetPosition; i--) {
                        Collections.swap(mItems, i, i - 1);// 改变实际的数据集
                    }
                }
                mAdapter.notifyItemMoved(fromPosition, targetPosition);
                return true;
            }

            /**
             * 侧滑删除后会回调的方法
             */
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                // 获取当前删除的位置
                int position = viewHolder.getAdapterPosition();
                mItems.remove(position);
                // adapter 更新notify当前位置删除
                mAdapter.notifyItemRemoved(position);
            }

            /**
             * 拖动选择状态改变回调
             */
            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
                    // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了
                    // 侧滑或者拖动的时候背景设置为灰色
                    viewHolder.itemView.setBackgroundColor(Color.GRAY);
                }
            }

            /**
             * 回到正常状态的时候回调
             */
            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                // 正常默认状态下背景恢复默认
                viewHolder.itemView.setBackgroundColor(0);
                ViewCompat.setTranslationX(viewHolder.itemView,0);
            }
        });
        // 这个就不多解释了,就这么attach
        itemTouchHelper.attachToRecyclerView(mRecyclerView);

这里写图片描述
  
附视频地址:http://pan.baidu.com/s/1jIlwl4E

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Ubuntu 中,我们可以使用 Make 工具来安装卸载一些软件Make 是一个非常强大的自动化工具,它可以根据预先定义的规则和指令来自动化编译安装卸载软件。 以下是使用 Make 工具安装卸载软件的步骤: 1. 安装软件所需的依赖项: 在终端中输入以下命令: ``` sudo apt-get install build-essential ``` 这将安装一些必要的编译工具和依赖项。 2. 下载软件源代码: 使用浏览器或 wget 命令下载软件的源代码。例如,如果要下载示例软件的源代码,则可以运行以下命令: ``` wget https://example.com/software.tar.gz ``` 3. 解压缩源代码: 使用 tar 命令解压缩下载的源代码文件。例如,如果下载的文件名为 software.tar.gz,则可以运行以下命令: ``` tar -xvzf software.tar.gz ``` 4. 进入解压后的目录: 使用 cd 命令进入解压后的目录。例如,如果解压后的目录名为 software,则可以运行以下命令: ``` cd software ``` 5. 编译源代码: 运行以下命令来编译源代码: ``` make ``` 这将根据 Makefile 文件中的规则来编译源代码。 6. 安装软件: 运行以下命令来安装软件: ``` sudo make install ``` 这将根据 Makefile 文件中的规则来安装软件。 7. 卸载软件: 如果要卸载软件,则可以在软件源代码目录中运行以下命令: ``` sudo make uninstall ``` 这将根据 Makefile 文件中的规则来卸载软件。 请注意,不是所有软件都使用 Make 工具进行安装卸载。有些软件可能使用其他工具或方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值