Android开发之ItemTouchHelper解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/AnalyzeSystem/article/details/80165740

转载请标明出处:
https://blog.csdn.net/AnalyzeSystem/article/details/80165740
本文出自AnalyzeSystem的博客

撸这篇博客只是因为下篇博客卡片分析开源库所需,无他为学习尔


RecyclerView的Item可上线左右拖拽,实现起来也比较简单,这里需要用到ItemTouchHelper.Callback类


public abstract static class Callback {

        @Override
        public boolean isItemViewSwipeEnabled() {
            return true;
        }

        @Override
        public boolean isLongPressDragEnabled() {
            return true;
        }

        @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            //TODO
            int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
            return makeMovementFlags(dragFlags, swipeFlags);
        }

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

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

}

重写getMovementFlags()方法设置拖放和滑动的方向。使用ItemTouchHelper.makeMovementFlags(int, int)来构造返回的flag。支持长按RecyclerView item进入拖动操作,你必须在isLongPressDragEnabled()方法中返回true,在view任意位置触摸时启用滑动操作isItemViewSwipeEnabled()方法中返回true

        @Override
        public boolean isLongPressDragEnabled() {
            return true;
        }

        @Override
        public boolean isItemViewSwipeEnabled() {
            return true;
        }

onSwiped、onMove函数回调,adapter做相应的数据处理,并调用notifyItemRemoved()和 notifyItemMoved()各自对应函数更新UI.这里补充一个基础知识点:

//把集合内的元素进行位置交换
Collections.swap(list,i,j)

最后利用ItemTouchHeper把Callback绑定到RecyclerView就ok了,这样一个简单地上下拖拽左右滑动删除就实现了.

        ItemTouchHelper.Callback callback =
                new SimpleItemTouchHelperCallback();
        ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
        touchHelper.attachToRecyclerView(recyclerView);

之前发现一篇app端图文混排编辑器相关的Blog地址如下

https://blog.csdn.net/qq569699973/article/details/75390091

当你了解ItemTouchHelper.Callback使用后你有没有觉得如此简单呢?

我们常用的QQ消息列表,支持左右滑动弹出删除、置顶相关UI,以前的实现方案都是SwipeMenu之类的开源库来实现,现在用ItemTouchHelper辅助实现更简单了,滑动删除逻辑修改判断值getWidth/2改为删除、置顶等功能的parent.getWidth/2,Item的滑动删除动画是针对的整个View,要实现QQ的滑动删除效果,我们需要的是内容偏移,这样底部的删除置顶功能就出来了。

RecyclerView 在Touch的时候需要取消每个Item的删除显示,防止复用误差问题。

最后在推荐一个开源库,可以更好地帮助你理解ItemTouchHelper、Callback

https://github.com/YoKeyword/ItemTouchHelperDemo

猜你喜欢

转载自blog.csdn.net/AnalyzeSystem/article/details/80165740