【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )

简介: 【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )

文章目录

一、ItemTouchHelper 简介

二、RecyclerView 相关资料





一、ItemTouchHelper 简介


官方文档 : https://developer.android.google.cn/reference/kotlin/androidx/recyclerview/widget/ItemTouchHelper


ItemTouchHelper 可以为 RecyclerView 添加 滑动删除效果 和 拖动效果 ;


ItemTouchHelper 需要与 RecyclerView 和 ItemTouchHelper.Callback 结合起来使用 ;



根据想要开发的功能 , 重写不同的方法 ;


如果是想要开发拖动效果相关的功能 , 重写 ItemTouchHelper.Callback 的 onMoved 方法 ;


   

public abstract boolean onMove(@NonNull RecyclerView recyclerView,
                @NonNull ViewHolder viewHolder, @NonNull ViewHolder target);


如果想要开发滑动相关效果 , 重写 ItemTouchHelper.Callback 的 onSwiped 方法 ;


public abstract void onSwiped(@NonNull ViewHolder viewHolder, int direction);



ItemTouchHelper 需要与 LayoutManager 布局管理器结合使用 ;


通过 继承 ItemTouchHelper.Callback 抽象类 , 或


实现 ItemTouchHelper.Callback 接口 ,


这两个操作 自定义 LayoutManager 布局管理器 , 可以达到最优化的效果 ;



看一下 Android 官方定义的 线性布局管理器 LinearLayoutManager , 就实现了 ItemTouchHelper.ViewDropHandler 接口 ;


public class LinearLayoutManager extends RecyclerView.LayoutManager implements
        ItemTouchHelper.ViewDropHandler, RecyclerView.SmoothScroller.ScrollVectorProvider {
}


默认情况下 , ItemTouchHelper 移动 item 组件的 translateX 或 translateY 属性 , 为其重新设置位置 ;


开发者可以自定义这些行为通过覆盖 ItemTouchHelper.Callback 的 onChildDraw 和 onChildDrawOver 方法 ;


大多数情况下只需要覆盖 onChildDraw 方法即可 ;


onChildDraw 方法原型 :


public class ItemTouchHelper extends RecyclerView.ItemDecoration
        implements RecyclerView.OnChildAttachStateChangeListener {
  public abstract static class Callback {
        /**
         * Called by ItemTouchHelper on RecyclerView's onDraw callback.
         * <p>
         * If you would like to customize how your View's respond to user interactions, this is
         * a good place to override.
         * <p>
         * Default implementation translates the child by the given <code>dX</code>,
         * <code>dY</code>.
         * ItemTouchHelper also takes care of drawing the child after other children if it is being
         * dragged. This is done using child re-ordering mechanism. On platforms prior to L, this
         * is
         * achieved via {@link android.view.ViewGroup#getChildDrawingOrder(int, int)} and on L
         * and after, it changes View's elevation value to be greater than all other children.)
         *
         * @param c                 The canvas which RecyclerView is drawing its children
         * @param recyclerView      The RecyclerView to which ItemTouchHelper is attached to
         * @param viewHolder        The ViewHolder which is being interacted by the User or it was
         *                          interacted and simply animating to its original position
         * @param dX                The amount of horizontal displacement caused by user's action
         * @param dY                The amount of vertical displacement caused by user's action
         * @param actionState       The type of interaction on the View. Is either {@link
         *                          #ACTION_STATE_DRAG} or {@link #ACTION_STATE_SWIPE}.
         * @param isCurrentlyActive True if this view is currently being controlled by the user or
         *                          false it is simply animating back to its original state.
         * @see #onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int,
         * boolean)
         */
        public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
                @NonNull ViewHolder viewHolder,
                float dX, float dY, int actionState, boolean isCurrentlyActive) {
            ItemTouchUIUtilImpl.INSTANCE.onDraw(c, recyclerView, viewHolder.itemView, dX, dY,
                    actionState, isCurrentlyActive);
        }
    }
}


onChildDrawOver 方法原型 :


public class ItemTouchHelper extends RecyclerView.ItemDecoration
        implements RecyclerView.OnChildAttachStateChangeListener {
  public abstract static class Callback {
        /**
         * Called by ItemTouchHelper on RecyclerView's onDraw callback.
         * <p>
         * If you would like to customize how your View's respond to user interactions, this is
         * a good place to override.
         * <p>
         * Default implementation translates the child by the given <code>dX</code>,
         * <code>dY</code>.
         * ItemTouchHelper also takes care of drawing the child after other children if it is being
         * dragged. This is done using child re-ordering mechanism. On platforms prior to L, this
         * is
         * achieved via {@link android.view.ViewGroup#getChildDrawingOrder(int, int)} and on L
         * and after, it changes View's elevation value to be greater than all other children.)
         *
         * @param c                 The canvas which RecyclerView is drawing its children
         * @param recyclerView      The RecyclerView to which ItemTouchHelper is attached to
         * @param viewHolder        The ViewHolder which is being interacted by the User or it was
         *                          interacted and simply animating to its original position
         * @param dX                The amount of horizontal displacement caused by user's action
         * @param dY                The amount of vertical displacement caused by user's action
         * @param actionState       The type of interaction on the View. Is either {@link
         *                          #ACTION_STATE_DRAG} or {@link #ACTION_STATE_SWIPE}.
         * @param isCurrentlyActive True if this view is currently being controlled by the user or
         *                          false it is simply animating back to its original state.
         * @see #onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int,
         * boolean)
         */
        public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
                ViewHolder viewHolder,
                float dX, float dY, int actionState, boolean isCurrentlyActive) {
            ItemTouchUIUtilImpl.INSTANCE.onDrawOver(c, recyclerView, viewHolder.itemView, dX, dY,
                    actionState, isCurrentlyActive);
        }
    }
}





二、RecyclerView 相关资料


官方文档 :


使用 RecyclerView 创建动态列表 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview


高级 RecyclerView 自定义 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview-custom


RecyclerView 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView


RecyclerView.Adapter 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.Adapter


RecyclerView.ViewHolder 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder


RecyclerView.ItemDecoration 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ItemDecoration


GridLayoutManager 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/GridLayoutManager


LinearLayoutManager 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/LinearLayoutManager


StaggeredGridLayoutManager 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/StaggeredGridLayoutManager


ItemTouchHelper 官方文档 : https://developer.android.google.cn/reference/kotlin/androidx/recyclerview/widget/ItemTouchHelper


ItemTouchHelper.Callback 官方文档 : https://developer.android.google.cn/reference/kotlin/androidx/recyclerview/widget/ItemTouchHelper.Callback



代码示例 :


GitHub 源码地址 : https://github.com/han1202012/001_RecyclerView


博客源码快照 : https://download.csdn.net/download/han1202012/14984775


( 使用 Android Studio 打开 )


目录
相关文章
|
人工智能 安全 搜索推荐
未来智能家居技术的发展趋势与应用前景
在当今数字化快速发展的时代,智能家居技术正逐渐成为人们生活的重要组成部分。本文将探讨未来智能家居技术的发展趋势和应用前景,从人工智能、物联网、生物识别等多个方面展开分析,展望未来智能家居给我们带来的便利与未来发展的可能性。
269 29
|
弹性计算 人工智能 安全
阿里云弹性计算:助力企业实现灵活扩展与高效计算
【10月更文挑战第6天】在现代企业的数字化转型中,云计算已经成为不可或缺的技术基础。阿里云弹性计算(Elastic Compute Service, ECS)凭借其强大的弹性伸缩能力、高可用性和灵活性,帮助企业在云端实现高效的业务运营和资源管理。本文将探讨阿里云弹性计算的主要功能、技术优势以及在各行业中的应用场景。
671 7
|
存储 数据处理
GDPR
【10月更文挑战第7天】GDPR
797 7
|
7月前
|
Ubuntu 关系型数据库 MySQL
mysql8.0安装初始化不需要设定root密码?
uubntu 的mysql安装完成后无法设定root密码
462 10
|
机器学习/深度学习 人工智能 搜索推荐
AI与娱乐产业:电影制作的新工具
随着科技的发展,人工智能(AI)逐渐渗透到电影制作中,带来了前所未有的创新。本文探讨了AI在剧本创作、场景构建、特效制作、动作捕捉、音频处理、剪辑及市场调研等领域的应用,以及其对提升效率、激发创意和拓宽视野的影响,展望了AI在未来电影产业中的重要作用。
|
运维 Serverless 数据处理
函数计算产品使用问题之Animatediff插件怎么安装
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
存储 安全 数据安全/隐私保护
恶意软件 (Malware)
【8月更文挑战第17天】
641 2
|
存储 云安全 安全
云端数据加密实践
【7月更文挑战第12天】云端数据加密是保障云端数据安全的重要手段。通过选择合适的加密方式、加强加密密钥管理、实施静态与动态数据加密、采用加密信息检索技术和应用层加密组件等措施,可以有效地保护云端数据的安全。未来,随着技术的不断进步和应用需求的多样化,云端数据加密技术将继续发挥其重要作用,为各种应用场景提供强大的安全保障。

热门文章

最新文章