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

不可见的ViewHolder动画在RecyclerView中延迟

是指在使用RecyclerView进行列表展示时,当某个ViewHolder不可见时,执行的动画会出现延迟的情况。

这种延迟通常是由于RecyclerView的回收复用机制导致的。RecyclerView会在滑动过程中回收不可见的ViewHolder,并将其复用来展示新的数据项。当一个ViewHolder从可见状态变为不可见状态时,如果该ViewHolder正在执行动画,RecyclerView会将其移除动画队列,以便回收复用。当该ViewHolder再次变为可见状态时,RecyclerView会重新执行动画。这个过程中的延迟就是不可见的ViewHolder动画在RecyclerView中延迟的原因。

为了解决这个问题,可以尝试以下几种方法:

  1. 使用RecyclerView的setItemAnimator(null)方法来禁用默认的动画效果。这样可以避免动画的延迟,但也会失去动画效果。
  2. 自定义RecyclerView的ItemAnimator,重写animateDisappearance()方法,使不可见的ViewHolder立即执行消失动画,而不是延迟执行。
  3. 在RecyclerView的Adapter中,重写onViewDetachedFromWindow()方法,在ViewHolder从RecyclerView中移除时取消动画。然后在onViewAttachedToWindow()方法中重新执行动画。
  4. 使用RecyclerView的addOnScrollListener()方法,监听滑动事件,在滑动过程中暂停动画,滑动停止后再重新执行动画。

需要注意的是,以上方法都是针对RecyclerView的默认动画效果而言的。如果使用了自定义的动画效果,需要根据具体情况进行相应的处理。

推荐的腾讯云相关产品:无

参考链接:

  • RecyclerView官方文档:https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView
  • RecyclerView动画指南:https://developer.android.com/guide/topics/ui/layout/recyclerview#animations
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android知识笔记:记录 2 个 “容易误解” 的Android 知识点

答: onAttachedToWindow和onDetachedFromWindow在RecyclerView中还适用吗?...在RecyclerView中,Item的这两个方法分别会在【首次出现】和【完全滑出屏幕】(即在屏幕中完全不可见)时回调(在Adapter中也可以重写同名方法,用来监听ViewHolder的出现和消失)。...我们先粗略地温习一下RecyclerView的回收机制: RecyclerView在布局(自然滑动其实也是反复布局子View)时,会回收一些符合条件的ViewHolder,它会根据ViewHolder的状态来决定临时存放在哪个地方...那么,这些留在mAttachedScrap中没有被取出来的ViewHolder会怎么样呢?...倒计时/动画在这里取消的话,是完全没问题的(但记得保存当前进度,以便下次恢复)。 所以与onBindViewHolder对应的方法,就是这个onViewRecycled了。

94920
  • 记一次全民K歌的crash定位过程

    一、问题 从下面堆栈中可以看出,RecyclerView此时正在执行布局,尝试获取ViewHolder缓存时发生了crash。...2、缓存策略 RecyclerView共有以下几种缓存: mAttachedScrap 未与RecyclerView分离的ViewHolder缓存,用于layout过程中临时存放,可以简单理解为当前屏幕正在显示且数据没有发生变化的内容...View的出现,一个新创建的添加到RecyclerView中显示,并清除FLAG_TMP_DETACHED标记,另一个仍然存在于Scrap缓存中未被使用 ④ 取到了Scrap缓存中Footer的ViewHolder...的,可以自行了解下ViewHolder的mPreLayoutPosition跟mPosition的作用,这里不细说了 五、总结 至此,原因也就比较清晰了:用户使用K歌停留在动态非好友页,退后台被系统杀掉重启时...,没有考虑到Fragment恢复的情况,导致在正常的Fragment下多生成了一个不可见的Fragment,之后发布了作品并对其执行了会引起数据变化的互动操作,使其layout到布局中,刷新列表后不可见的

    2.2K30

    RecyclerView技术栈参考资料:

    滚出可见区域的条目将被回收,并在下一个条目可见的时候被复用。 我们可以从下图中得到更直观的解释: ? 左边的图是数据初始化后的示例,当向上滚动视图的时候,当条目不可见之后将被回收。...右图中红色区域内的两条不可见条目,将被放到缓存队列中以便新的条目可见时进行复用。...由此可见,想要在ListView中实现条目的增删动画是一件非常困难的事情,但是RecyclerView为我们提供了很好的便利。...而且RecyclerView增强了ViewHolder设计模式,这在当前所使用的ListView中是不曾有的。...与传统ListView比较 RecyclerView与老前辈ListView的不同点,主要在于以下几个特性: Adapter中的ViewHolder模式 - 对于ListView来说,通过创建ViewHolder

    1.2K10

    ListView的相关总结

    结果当然是否定的, 这样对于内存和CPU是极大的浪费。 其实每个在可见 UI之外的 item并不一定会被销毁, 而是会被重用, 如果你尝试在 getView 方法中这么写的话, .......,用 converView的 setTag把 ViewHolder对象设进去 然后再复用的时候用 getTag获得 ViewHolder并改变它的数据 减少渲染UI的时间 · 对于包含 Bitmap...用 RecyclerView 替代 ListView ListView的局限 其实 ListView的局限很明显, 最简单的是它不能提前渲染 item, 这就造成当我们尝试用异步的方式来延迟渲染的时候有可能会让...原因很简单, 每个 item可能高度不一样, 在延迟渲染完成后高度发生了变化,这就导致整个UI发生跳动, 这样的问题在一些复杂的场景下很难解决, 所以最简单直接的办法是。。。...用 RecyclerView吧。。。

    40620

    ListView 和 RecyclerView 的对比分析

    业务逻辑代码省略 */ return convertView; } 上面的这段代码是常见的开发者在ListView中自己实现ViewHolder的典型代码....ListView缓存示意图 ActiveViews:屏幕中可见View的缓存 ScrapViews:顾名思义是已废弃的View的缓存,也就是item在滑出界面后View会被存放到ScrapViews中...,RecyclerView实现了四级缓存,提升view性能 布局 和 ListView 相比,RecyclerView支持3种类型的布局,使得能够展示的数据样式更加丰富 ViewHolder机制 /**...的Adapter 需要传入一个 ViewHolder,ViewHolder的相关机制RecyclerView已经默认给实现了。...缓存的是屏幕中可见的ViewHodler数据,(通过postion来查找) CachedCiews:第二级缓存,将刚刚移出屏幕的item放入这里(默认2个),通过postion来查找。

    1.1K40

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

    ViewHolder ViewHolder 大伙也不陌生了,但没想到我会单独开个小节来讲吧,也是,平时使用时顶多就是继承它,然后重写一下构造方法而已,但其实,它本身携带着很多信息,利用得当的话,可以方便我们处理很多事情...由于场景 3 将日志的执行时机延迟到下一帧的界面刷新之后,所有,可以看到,界面刷新之后,原本的第一个 Item 就被移除掉了。...首先需要明确,RecyclerView 的回收机制在工作时,会先将移出屏幕的 ViewHolder 放进一级缓存中,当一级缓存空间已满时,才会考虑将一级缓存中已有的 ViewHolder 移到 RecyclerViewPool...另外,注释中也说了,该方法的回调是在 ViewHolder 放进 RecyclerViewPool 中前,而 ViewHolder 在放进 Pool 中时会被 reset,因为上一节中也说过,其实 ViewHolder...至于应用场景,拿到 ViewHolder 能做的事就更多了,而是 LayoutParams 提供的信息其实内部也是去 ViewHolder 中拿的,所以实际上 Item 携带的各种信息基本都在 ViewHolder

    3.2K60

    轻松掌握RecyclerView缓存机制

    当一个 ViewHolder 不再需要展示时,RecyclerView 会将其加入到 Scrap Cache 中,以便在需要的时候可以快速地进行重用。...在布局过程中,LayoutManager 可以从 ViewPool 中获取可重用的 ViewHolder,并且将其放回 ViewPool 中以便在需要的时候可以快速的获取。...这就意味着,如果你的 ViewHolder 需要重新绑定数据,就必须在 RecyclerView 中手动调用 onBindViewHolder 方法。...回收 ViewHolder 资源 在 RecyclerView.Adapter 中重写 onViewRecycled() 方法,以便在 ViewHolder 从屏幕中移除后回收其资源。...通过设置 RecyclerView 的 ItemAnimator,可以在 RecyclerView 的添加删除动作时显示动效,让用户更好的体验到Item之间变化的过程。

    56421

    从 Android 开发到读懂源码 第05期:Leanback 结构源码简析

    Presenter 提供视图创建及数据绑定,类似 RecyclerView.Adapter 的功能,注意是类似,下面的 ItemBridgeAdapter 才是填充到BaseGridView 中真正的...所说的 ArrayObjectAdapter 中的数据,例如 sample 中的 CustomDataObject 和 ListRow viewHolder.mItem = mAdapter.get...创建临时 ViewHolder,这个 holder 只包含列表视图 HorizontalGridView,不包含头部视图 ViewHolder vh = createRowViewHolder...例如在多 ViewType 的形式下,一般我们写 RecyclerView.Adapter 是这样的: public class CutstomAdapter extends RecyclerView.Adapter...= null) { // 设置焦点变化监听,这个 Listener 是每个 ViewHolder 中对应的,监听的是 ViewHolder 的 ItemView

    2.3K71

    recycleview的优化_recyclerview原理

    中移出的ViewHolder放到Pool中,放之前会把ViewHolder数据清除掉,所以复用时需要重新bindView。...RecyclerView (以及其他基于adapter的view,比如ListView、GridView等)使用了缓存机制重用子 view(即系统只将屏幕可见范围之内的元素保存在内存中,在滚动的时候不断的重用这些内存中已经存在的...这个机制会导致一个问题,启动应用之后,在屏幕可见范围内,如果只有一张卡片可见,当滚动的时 候,RecyclerView找不到可以重用的view了,它将创建一个新的,因此在滑动到第二个feed的时候就会有一定的延时...但第一种情况,RecyclerView内部做了回收工作,设不设置影响不大,设置此属性作用主要针对第二种情况。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    4.3K21

    深入浅出 RecyclerView

    不过 RecyclerView 的 ViewHolder 创建稍微有些限制,类名就是上面继承的时候泛型中声明的类名(或者应该说,上面泛型中的类名需要是这个holder的类名);并且 ViewHolder...使用 demo 可以查看:Github 【RecyclerView默认动画】 LayoutManager的常用方法 findFirstVisibleItemPosition() 返回当前第一个可见 Item...() 返回当前最后一个可见 Item 的 position findLastCompletelyVisibleItemPosition() 返回当前最后一个完全可见 Item 的 position. scrollBy...ViewHolder 每个 ViewHolder 的内部是一个 View,并且 ViewHolder 必须继承自RecyclerView.ViewHolder类。...RecyclerView 的内部维护了一个二级缓存,滑出界面的 ViewHolder 会暂时放到 cache 结构中,而从 cache 结构中移除的 ViewHolder,则会放到一个叫做RecycledViewPool

    1.7K60

    Android RecyclerView 缓存机制深度解析与面试题

    它通过多级缓存来复用视图,减少布局的测量和绘制,从而提高滚动的流畅性。 缓存级别 一缓(mAttachedScrap):缓存屏幕中可见范围的 ViewHolder。...缓存:ViewHolder 被回收后,会根据需要被添加到上述缓存中。...源码分析 在 RecyclerView 的 Recycler 内部类中,缓存机制的核心代码如下: public final class Recycler { final ArrayListViewHolder...6、 如何在 RecyclerView 中实现预加载? 通过 GapWorker 类和 RecyclerView 的预加载机制,提前加载即将显示的视图。...结语 深入理解 RecyclerView 的缓存机制对于优化列表和网格的性能至关重要。通过本文的分析,希望你能在面试中更好地展示你对 RecyclerView 缓存机制的理解和实践经验。

    18910

    【RecyclerView】 十三、RecyclerView 数据更新 ( 移动数据 | 数据改变 )

    (int fromPosition, int toPosition) 函数原型 : 该函数定义在 RecyclerView 的内部类 Adapter 中 ; public class RecyclerView...: int positionStart 参数 : 被修改的元素在原数据集中首个元素的位置索引 ; int itemCount 参数 : 数据集中被修改元素个数 ; 注意 : 该方法不指定数据集发生了哪些变化..., 通知数据发生了改变 , RecyclerView 会尝试去 为适配器 同步可见的结构性改变事件 ; 这样有助于动画和可视化对象的持续 , 但是单独的 item 元素组件需要重新被绑定 ; 代码示例...(int position) 函数原型 : 该函数定义在 RecyclerView 的内部类 Adapter 中 ; public class RecyclerView extends ViewGroup..., 通知数据发生了改变 , RecyclerView 会尝试去 为适配器 同步可见的结构性改变事件 ; * 这样有助于动画和可视化对象的持续 , 但是单独的 item 元素组件需要重新被绑定

    3.4K00

    RecyclerView滑动时卡顿怎么办?

    1.recyclerview的item加载顺序 recyclerview 的使用大家肯定不陌生了,但是每个item的加载顺序还是有必要了解一下的,知道item显示出来的流程。...getItemViewType(获取显示类型,返回值可在onCreateViewHolder中拿到,以决定加载哪种ViewHolder) onCreateViewHolder(加载ViewHolder的布局..., 对于列表来说,不管用RecyclerView 还是ListView,我们都会用ViewHolder来复用布局。...,尽量减少滚动过程中的耗时操作,这样滚动停止的时候再加载可见区域的布局,因为这个时候是停止状态,即使略微耗时一些用户的感知也是比较小的,就会给人一种不卡的假象。...newState)中回调两个变量: recyclerView : 当前在滚动的RecyclerView newState : 当前滚动状态.

    3.4K20
    领券