首页
学习
活动
专区
工具
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实现应用内换肤

44820
  • Android使用CardView作为RecyclerViewItem并实现拖拽左滑删除

    引言 CardView是Android 5.0系统之后引入众多控件之一,实现之后效果也是比较酷,它经常被用在RecyclerViewListView中Item中。...ItemTouchHelper 想实现拖拽滑动删除效果,很可惜RecyclerView并没有提供现成API供我们使用,但是SDK为我们提供了ItemTouchHelper这样一个工具类帮助我们来轻松实现这些功能...1.新建一个接口,并且让Adapter实现 我们选择使用一个接口来实现AdapterItemTouchHelper之间涉及数据操作,因为ItemTouchHelper完成触摸各种动画以后,就要对Adapter...ItemView初始状态,防止由于复用产生错乱问题。...public void onChildDraw(…):我们可以在这个方法内实现我们自定义交互规则或者自定义动画。 这样下来我们就只剩下一步了。

    2K10

    不可错过几款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.8K20

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

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

    10210

    RecyclerView | 在 RecyclerView 中使用 ListAdapter

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

    1.4K20

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

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

    6610

    【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常用总结

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

    1.3K30

    Android 高仿微信朋友圈拍照上传功能

    PhotoPicker使用 这是一个支持选择多张图片,点击图片放大,图片之间左右滑动互相切换库,同时支持图片删除库,效果类似微信。...(1) 添加PhotoPicker架包 (2) 使用 选择图片:安卓6.0以后需要在代码中添加读写sd卡相机权限 当然清单文件中也需要添加 PhotoPicker.builder()...| ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允许上下左右拖动 swipeFlags = 0; /...public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //重置改变,防止由于复用导致显示问题...super.clearView(recyclerView, viewHolder); viewHolder.itemView.setBackgroundColor(0); } //我们可以在这个方法内实现我们自定义交互规则或者自定义动画效果

    1.5K20

    Android使用RecycleView实现拖拽交换item位置

    相比起ListView而言,RecycleView实现拖拽交换位置效果要简单很多,因为通过SDK中ItemTouchHelper工具类可以轻松实现这种效果,并且一套代码支持所有布局方式;ListView...而我们真正需要关心地方就是ItemTouchHelper内部类ItemTouchHelper.Callback,它是一个抽象类,需要我们去实现下面这几个关键抽象方法以及重写几个非抽象方法: //...//移除View状态有关,通常用于清除在onSelectedChanged,onChildDraw中对View设置动画 public void clearView(RecyclerView recyclerView...来看看我定义解耦接口: /** * 定义RecycleViewAdapterSimpleItemTouchHelperCallback直接交互接口方法 * Created by mChenys...recyclerView.isComputingLayout()) { //当需要清除之前在onSelectedChanged或者onChildDraw,onChildDrawOver设置状态或者动画时通过接口返回该

    2.9K32

    【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之间横竖都以相同空隙间隔开 //实现方式,以水平方向为例: //每个viewleftbottom都设置相同间隙 //去掉第1列left

    1.3K30

    Android--ItemTouchHelper源码分析

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

    86020

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

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

    1.1K20

    recycleview优化_recyclerview原理

    具体实现原理可参考:RecyclerView预加载机制源码分析 完成这些工作基本上没有任何代价,因为 UI 线程在两帧之间空隙不做任何工作。...必须确保共享RecyclerViewAdapter是同一个,或view type 是不会冲突。...9.3 详解7.0带来新工具类:DiffUtil DiffUtil是support-v7:24.2.0中新工具类,它用来比较两个数据集,寻找出旧数据集—>新数据集最小变化量,它mAdapter.notifyDataSetChanged...10.1 由于RecyclerView缓存view复用导致图片错乱 Recyclerview缓存机制,作者主要在对RecyclerViewItemView某些图片进行了属性动画变换,这样就改变了ViewHolder...按道理RecyclerView内部onAttachedToWindowonDetachedFromWindow分别进行了引用释放引用,是不会发生内存泄漏,但是由于开发者应对环境不一样,遇到坑也不一样

    4K21
    领券