首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

由于ItemTouchHelper和DiffUtil之间的冲突而产生的有害动画

是指在使用RecyclerView进行列表项拖拽或滑动删除时,由于ItemTouchHelper和DiffUtil的使用方式不当,导致列表项的位置变化与数据集的更新不一致,从而产生不良的动画效果。

ItemTouchHelper是Android Support库中提供的一个工具类,用于实现RecyclerView的拖拽和滑动删除功能。它可以通过实现ItemTouchHelper.Callback来自定义拖拽和滑动删除的行为。

DiffUtil是Android Support库中提供的一个工具类,用于计算并更新RecyclerView的数据集。它可以通过比较两个数据集的差异,快速计算出需要进行插入、删除、移动和更新的列表项,从而避免不必要的数据刷新。

当ItemTouchHelper和DiffUtil同时使用时,可能会出现冲突。这是因为ItemTouchHelper在拖拽和滑动删除时会直接修改RecyclerView的数据集,而DiffUtil则会根据数据集的变化来更新RecyclerView的显示。如果在拖拽或滑动删除过程中,DiffUtil正在计算数据集的差异并更新RecyclerView,就会导致动画效果不一致,出现有害的动画。

为避免这种冲突,可以采取以下措施:

  1. 在拖拽或滑动删除开始时,暂停DiffUtil的计算和数据集的更新,直到拖拽或滑动删除结束后再恢复计算和更新。
  2. 在拖拽或滑动删除结束后,手动调用DiffUtil的计算和更新方法,确保数据集与RecyclerView的显示一致。
  3. 在使用ItemTouchHelper和DiffUtil之前,先确保数据集的一致性,避免出现不必要的数据刷新。

总之,合理使用ItemTouchHelper和DiffUtil,并注意它们之间的冲突,可以实现良好的拖拽和滑动删除效果,并保持数据集与RecyclerView的一致性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ItemTouchHelper 实现交互动画

04.拖拽效果上优化 拖拽效果优化 在item被拖拽或侧滑时修改背景色,当动作结束后将背景色恢复回来,而ItemTouchHelper.Callback中正好有对应这两个状态的方法,分别是:onSelectedChanged...让item执行了两种属性动画而已,在ItemTouchHelper.Callback中有一个方法可以拿到item被拖拽或滑动时的位移变化,那就是onChildDraw()方法,在该方法中设置item渐变和缩放属性动画...并不是多出了两条空白数据,它们是正常的数据,只是看不到了,这是因为RecyclerView条目(itemView)覆用导致的,前面在onChildDraw()方法中对itemView设置了透明和缩小,而一个列表中固定只有几个...之间共享View。...()的区别 23.RecyclerView滑动冲突 01.如何判断RecyclerView控件滑动到顶部和底部 02.RecyclerView嵌套RecyclerView 条目自动上滚的Bug 03.ScrollView

3.9K20

分享一个不错的开源项目

年初计划和朋友一起,利用周末和闲暇时间开发一个开源的项目,权当练手。全部使用最新控件、开发框架和设计思路。...从决定开始到现在已经快四个月了,中间由于生活上和工作上的各种事情,中间断了很长时间,总算是基本完成了。...内容来自某大神抓的头条数据,由于间隔时间太长,开始的时候接口还ok,现在已经报404了,还好视频模块的接口还可以用。...项目已经提交到github,https://github.com/shuaijia/JsHeadline有兴趣的可以clone,一起探讨。...DiffUtil , 不再无脑 notifyDataSetChanged; 使用 ItemTouchHelper 实现今日头条的频道排序、频道移动; 使用AndroidChangeSkin实现应用内换肤

45120
  • 不可错过的几款GitHub开源项目

    使用Material Design控件和动画 使用MVP架构整个项目,对应于model、ui、presenter三个包 使用Realm做阅读记录和收藏记录的增、删、查、改 使用Glide做图片的处理和加载...RxJava其他操作符来做延时、轮询、转化、筛选等操作 使用okhttp3对网络返回内容做缓存,还有日志、超时重连、头部消息的配置 使用Material Design控件和动画 使用MVP架构整个项目,...V层基类的构建, 包括 BaseActivity 和 BaseFragment , 对外提供了相同的接口 使用原生的夜间模式 解决侧滑返回与 View 冲突问题 内置 3 款 Logo, 随意切换 使用..., 不再无脑 notifyDataSetChanged 使用 ItemTouchHelper 实现今日头条的频道排序、频道移动, 参考 ItemTouchHelperDemo 使用 RxBinding...,小图是相册界面缩略图的时候加载的,大图是查看图片的时候加载的 图片处理 沙盒 Activity 退出和进入的动画 一些 UI 的动画,比如 “ 意见反馈”、 “ 语音输入” 这里面的动画 主题设置,沉浸式状态栏

    1.9K20

    RecyclerView | 在 RecyclerView 中使用 ListAdapter

    而 ListAdapter 可以处理元素的添加和删除而无需重绘视图,甚至可以为变化添加动画效果。 使用 ListAdapter 的另一个好处是: 当添加或删除元素的时候,还可以添加动画。...这样用户可以很直观地看到列表数据的变化。虽然没有 ListAdapter 也可以实现动画效果,但是这就需要开发者自行实现,并且由于带有动画的视图需要重绘,所以无法达到同样的性能表现。...添加元素的动画效果 处理差异比较 DiffUtil 是 ListAdapter 能够高效改变元素的奥秘所在。...DiffUtil 会比较新旧列表中增加、移动、删除了哪些元素,然后输出更新操作的列表将原列表中的元素高效地转换为新的元素。...为了能够识别新的数据,DiffUtil 需要您重写 areItemsTheSame() 和 areContentsTheSame()。areItemsTheSame() 检查两个元素是否为同一元素。

    1.5K20

    Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能

    DiffUtil 是一个用于计算两个列表之间差异的实用程序类,它可以帮助 RecyclerView 以更高效的方式更新数据。...调用 DiffUtil.calculateDiff 使用你的 Callback 实例调用 DiffUtil.calculateDiff,它将计算旧列表和新列表之间的差异。...使用 DiffUtil 可以显著提高数据更新的性能,因为它只会对实际发生变化的项进行更新,而不是刷新整个列表。...使用DiffUtil时常见的错误和原因 在使用 DiffUtil 进行数据集的最小更新时,以下是一些常见的错误及其原因: 错误的 areItemsTheSame实现: 原因:如果 areItemsTheSame...方法实现不当,比如仅仅比较对象引用而不是数据内容,DiffUtil 可能无法正确识别数据项是否相同,导致错误的更新或不更新。

    26410

    【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    | 滑动距离判定 | 滑动速度判定 | 设置动画时间 | 设置侧滑触发操作 ) 【Android 事件分发】ItemTouchHelper 实现拖动排序 ( 设置滑动方向 | 启启用长按拖动功能 |...DOWN / UP / CANCEL 三种动作 , MOVE 动作不拦截 , 取消操作很少遇到 , 因此 , 拦截机制中 , 只负责拦截手指按下 和 抬起 操作 , 在 ItemTouchHelper...拦截机制中 , 只负责拦截手指按下 和 抬起 操作 // 在 ItemTouchHelper 的业务逻辑中 , 不需要处理移动事件 if (action...View target = findChildView(event); 找到该条目对应的 View 组件后 , 遍历恢复动画 , 动画中有 mViewHolder 成员 , mViewHolder...* 最后的触摸事件和初始触摸事件之间的坐标差异 , 偏移值 . */ float mDx; float mDy; private final OnItemTouchListener

    1.8K20

    Android中使用 RecyclerView 时,有哪些常见的性能优化技巧可以分享?

    6、 使用DiffUtil: 利用 DiffUtil 计算数据集之间的差异,并只更新变化的部分,减少不必要的全局刷新。...15、 监控和分析性能: 使用 Android Profiler 监控 RecyclerView 的性能,分析布局测量、绘制和绑定数据的时间,找出性能瓶颈。...18、 使用 DiffUtil 进行局部更新: 当数据发生变化时,使用 DiffUtil 来计算最小更新集,而不是刷新整个列表。...19、 优化动画: 自定义 ItemAnimator 或使用 DefaultItemAnimator 的默认动画,避免复杂的动画效果影响性能。...20、 延迟和异步加载: 对于复杂的列表项,可以考虑在后台线程中预处理数据,然后在前台线程中进行绑定。

    34610

    Android-Recyclerview常用总结

    mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL)); 关于RecyclerView设置分割线和增加删除动画我们这里使用的是默认你都可以自定义...的原理和方法差异不大, 我们就统一写一个了。...image.png 3.RecyclerView之实现滑动删除拖拽排序(首个可以固定) 3.1实现RecyclerView的滑动删除拖拽排序 滑动删除和拖拽必须用到ItemTouchHelper ,我们看它如何使用...image.png 这样就是实现线性布局管理器和网格布局管理器区分对待,即:线性布局管理器拥有滑动删除和拖拽而网格布局管理器只拥有拖拽功能。...void endAnimations() 作用和endAnimation()一样,区别是停止多个动画时调用。 具体就不说了,demo已上传github,代码戳我.

    1.4K30

    Android--ItemTouchHelper源码分析

    ItemTouchHelper的基本使用上次已经介绍了,今天来分析下ItemTouchHelper的源码,我们从attachToRecyclerView方法入手 /** * Attaches...ItemTouchUIUtilImpl中的onDraw和onDrawOver方法,ItemTouchUIUtilImpl是ItemTouchUIUtil的实现类。...(api28中是设置View的属性),也就是我们拖拽和侧滑,最终的动画效果就是利用的canvas,那么具体我们要执行到哪个ViewHodler上,是在哪里判断的呢?...= null;而ACTION_UP,则会通过select方法将mSelected置空,并且判断是否需要执行侧滑动画,并最终根据判断是否要调用Callback的onSwiped方法,所以ItemTouchHelper...方法,这也是我们需要改写的拖拽方法,而ACTION_UP和onInterceptTouchEvent中的差不多 最后总结一下,ItemTouchHelper是通过OnItemTouchListener获取到选中的

    89120

    【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    | 滑动距离判定 | 滑动速度判定 | 设置动画时间 | 设置侧滑触发操作 ) 【Android 事件分发】ItemTouchHelper 实现拖动排序 ( 设置滑动方向 | 启启用长按拖动功能 |...RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) 先获取拖动的起始位置和目标位置...* 最后的触摸事件和初始触摸事件之间的坐标差异 , 偏移值 . */ float mDx; float mDy; private final OnItemTouchListener...anim.mViewHolder.itemView 为手指按下的子组件 // 即设置该动画作用于 RecyclerView 的哪个条目上 ; for (int i...* 为动画选择 item 项 * 该方法中进行一系列的计算 * * @param selected The ViewHolder to drag or

    1.2K20

    关于RecyclerView你知道的不知道的都在这了(下)目录正文

    7.2 DefaultItemAnimator RecyclerView 默认有提供 Item 的动画,而 SimpleItemAnimator 只是处理跟动画无关的准备工作,那么具体的默认动画的实现就是在...我也还没深入去仔细学习,大概过了一眼,这里就大概说下: 这个类用了很多集合来维护各种不同类型的动画,在四个 animateXXX() 方法中通过集合记录相对应类型的动画和做了动画的初始化工作。...120 ms 所以,RecyclerView 默认的 Item 动画其实也就透明度和移动动画两种,而且大多数情况下都只是单一的动画,只有 change 类型时才会是组合动画。...8.2 ItemTouchHelper 这是一个工具类,也是 Google 为了方便开发人员实现 item 的拖拽和移动等等效果所提供的一个辅助工具类。...外,内部的View之间横竖都以相同空隙间隔开 //实现方式,以水平方向为例: //每个view的left和bottom都设置相同间隙 //去掉第1列的left

    1.3K30

    Android-WItemTouchHelperPlus几行代码搞定仿QQ侧滑

    仿qq的侧滑,跟随滑动… 简单的侧滑点击删除,覆盖滑动… 二 知识准备 ItemTouchHelper是Android系统提供的一个帮助类,可以很轻松的用它实现长按拖拽和侧滑删除功能(这里的是侧滑之后直接删除整条...ItemTouchHelper.Callback 官方的解释是这样的,这个类是ItemTouchHelper和您的应用程序之间的契约。...,和动作执行结束后的回调....滑动的距离可以随意的固定. 侧滑恢复的动画我们可以控制. 总而言之给了开发者很大的自由....和系统类的一些不同,以及定制版的一些用法,希望大家多多指导文章中出现的错误,欢迎大家的反馈,欢迎评论吐槽哦~ 如果大家需要WItemTouchHelperPlus或者系统类ItemTouchHelper

    42310

    玩转仿探探卡片式滑动效果

    不过毋庸置疑的是,这种效果的原理肯定和 ListView / RecyclerView 类似,涉及到 Item View 的回收和重用,否则早就因为大量的 Item View 而 OOM 了。...而 LayoutManager 是可以通过自定义的方式来实现的。这恰恰是我们想要的!!!再说一点,这也正是不选用 ListView 的原因之一。 下面,我们就开始动手了。带你见证奇迹的时刻。...// 而第二层、第三层等等的卡片是禁止滑动的 view.setOnTouchListener(mOnTouchListener);...对于 ItemTouchHelper 来处理 Item View 的触摸滑动事件相必都不陌生吧,如果对这方面不太了解的同学可以看一下我之前的博客:《RecyclerView实现拖拽排序和侧滑删除》。...是缺少了动画。

    1.2K20

    安卓开发:玩转图片社交系统-仿探探卡片式滑动效果

    不过毋庸置疑的是,这种效果的原理肯定和 ListView / RecyclerView 类似,涉及到 Item View 的回收和重用,否则早就因为大量的 Item View 而 OOM 了。...究其原因,第一,RecyclerView 是自带 Item View 回收和重用功能的,就不需要我们考虑这个问题了;第二,RecyclerView 的布局方式是通过设置 LayoutManager 来实现的...而 LayoutManager 是可以通过自定义的方式来实现的。这恰恰是我们想要的!!!再说一点,这也正是不选用 ListView 的原因之一。 下面,我们就开始动手了。带你见证奇迹的时刻。...// 而第二层、第三层等等的卡片是禁止滑动的 view.setOnTouchListener(mOnTouchListener);...是缺少了动画。

    1.5K20
    领券