首页
学习
活动
专区
工具
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了。

93120
  • ListView相关总结

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

    40220

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

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

    2.2K30

    RecyclerView技术栈参考资料:

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

    1.2K10

    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来查找。

    98440

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

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

    3.1K60

    轻松掌握RecyclerView缓存机制

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

    52121

    Android RecyclerView刷新分页实现

    ; 根据用户滑动状态以及具体情况开始加载数据 通知数据更新; 如何获得 firstVisibleItemPosition 为了能够在数据加载动态判断什么时候加载数据,需要知道屏幕上显示第一个可见...四个方法: findFirstVisibleItemPosition() 获得屏幕上第一个可见 Item position,只要该 Item 有一部分可见,那么返回 position 就是该Item...findFirstCompletelyVisibleItemPosition() 获得屏幕上第一个完整可见 Item position,只要该 Item 有一部分不可见,那么返回 position...findLastCompletelyVisibleItemPosition() 获得屏幕上最后一个完整可见 Item position,只要该 Item 有一部分不可见,那么返回 position...根据不同 ViewType 加载多种布局用法,使用时根据不同布局创建不同 ViewHolder , 然后根据不同 Viewholder 为对应 Item 添加数据,注意 getItemViewType

    1.3K40

    从 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.2K71

    recycleview优化_recyclerview原理

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

    4.1K21

    深入浅出 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 ArrayList<ViewHolder...6、 如何在 RecyclerView 实现预加载? 通过 GapWorker 类和 RecyclerView 预加载机制,提前加载即将显示视图。...结语 深入理解 RecyclerView 缓存机制对于优化列表和网格性能至关重要。通过本文分析,希望你能在面试更好地展示你对 RecyclerView 缓存机制理解和实践经验。

    11810

    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
    领券