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

viewholder在滚动出屏幕时不会保持其状态

ViewHolder是Android开发中常用的一种设计模式,用于优化列表或网格视图的性能。它用于在RecyclerView或ListView等列表控件中缓存视图的引用,以便在滚动时快速重用,避免频繁创建和销毁视图对象,从而提高列表的滚动流畅性和性能。

当ViewHolder滚动出屏幕时,它的状态不会被保持。这是因为ViewHolder的主要目的是在列表滚动时快速重用视图,而不是保持视图的状态。当ViewHolder滚出屏幕时,它的视图会被回收,以便在列表滚动时可以被复用。

如果需要保持ViewHolder的状态,可以通过以下几种方式实现:

  1. 在ViewHolder中保存状态:可以在ViewHolder中添加成员变量来保存视图的状态,例如选中状态、展开状态等。在ViewHolder被重用时,可以根据保存的状态来更新视图。
  2. 使用数据集来保存状态:可以在数据集中添加字段来保存视图的状态。当ViewHolder被重用时,可以根据数据集中的状态字段来更新视图。
  3. 使用ViewModel来保存状态:可以使用Android Architecture Components中的ViewModel来保存视图的状态。ViewModel可以在配置变化(如屏幕旋转)时保持数据,并且可以与Fragment或Activity的生命周期绑定,以便在重建时恢复状态。

需要注意的是,无论采用哪种方式,都需要在适当的时机更新ViewHolder的状态,以确保状态正确地显示在视图上。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云移动开发平台:https://cloud.tencent.com/product/mpp
  • 腾讯云数据库:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网:https://cloud.tencent.com/product/iot
  • 腾讯云存储:https://cloud.tencent.com/product/cos
  • 腾讯云区块链:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/vr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

图文讲解RecyclerView的复用机制 ||Recyclerview进阶

状态变化如下图: ? 很明显在这种情形下Recycler中是不会存在任何可复用的ViewHolder。所以所有的ViewHolder都是新创建的。...即在这种情形下: Recycler只会通过Adapter创建ViewHolder,并且不会缓存这些新创建的ViewHolder 情形二 : 原有数据的情况下进行整体刷新 就是下面这种状态: ?...在前面的文章其实已经解释过: ViewHolder被标记为FLAG_TMP_DETACHED状态,并且itemview的parent被设置为null。...情形三 : 滚动复用 这个情形分析是情形二的基础上向下滑动ViewHolder的复用情况以及Recycler中ViewHolder的保存情况, 如下图: ?...,其实在个方法填充完子View之后就会把滚动屏幕的View做回收: int fill(RecyclerView.Recycler recycler, LayoutState layoutState,

1.6K30

recycleview的优化_recyclerview原理

这个机制会导致一个问题,启动应用之后,屏幕可见范围内,如果只有一张卡片可见,当滚动 候,RecyclerView找不到可以重用的view了,它将创建一个新的,因此滑动到第二个feed的时候就会有一定的延时...具体实现方式是: RecyclerView 开始一个滚动new Runnable对象,根据 layout manager 和滚动的方向预取即将进入视野的条目,可以同时取出一个或多个条目,例如在使用...移出屏幕ViewHolder会先进入第一级缓存ViewCache中,当第一级缓存空间已满,会考虑将一级缓存中已有的ViewHolder移到RecyclerViewPool中去。...2)每次打开界面都是定位在RecyclerView屏幕顶端,列表上面的布局都被顶上去了 RecyclerView抢占了焦点,自动滚动导致的....中ImageView的属性,滑动,RecyclerView的缓存复用机制可能导致ViewHolder不会重新创建,也不会重新bindView,这样某些ItemView的图片是View属性动画变换后的图片

3.7K20

RecyclerView预加载!

监听列表滚动状态 第一个想到的方案是监听列表滚动状态,当列表快滚动到底部执行预加载,RecyclerView.OnScrollListener提供了两个回调: public class RecyclerView...就测出 bug:当快速滚动列表onPreload()没有执行,当慢慢滚动列表onPrelaod()会执行多次。...不要担心用户列表底部多次上拉导致回调多次预加载,因为这种情况下onBindViewHolder()不会执行多次。当RecyclerView更换LayoutManager,也不需要修改代码。...唯一需要担心的是,列表滚动到底部触发了一次预加载后,又往回滚动(阈值位表项滚出屏幕),假设预加载迟迟没有完成,此时再次滚动到底部,移出屏幕的阈值位表项需要重新执行`onBindViewHolder(),...当然可以通过增加标记位解决这个问题: class VarietyAdapter: RecyclerView.Adapter() { // 增加预加载状态标记位 var

2.4K00

浅谈Android RecyclerView UI的滚动控件示例

ListView 由于强大的功能,在过去的 Andorid 开发中使用非常广泛。不过 ListView 需要优化来提升运行效率,就像我们之前所优化的那样,否则性能将很差。...然后 ViewHolder 的构造函数中传入一个 View 参数,它是 RecyclerView 子项的最外层布局,所以我们可以通过它来取得布局中的 ImageView 和 TextView 的实例。...onBindViewHolder – 对 RecyclerView 的子项数据进行赋值,这个方法会在每个子项被滚动屏幕进行。...我们把 ImageView 与 TextView 都设置为水平居中,而且用 android:layout_marginTop,让文字与图片保持了一段距离,这样更美观。...横向排列 我们可以水平方向上滑动来查看屏幕外的 “猫” 啦。

82710

2.ui

通过 android:maxLines指定 EditText的最大行数为两行,这样当输入的内容超过两行时,文本就会向上滚动,而 EditText则不会再继续拉伸 如何才能让进度条在数据加载完成消失呢?...invisible表示控件不可见,但是它仍然占据着原来的位置和大小, 可以理解成控件变成透明状态了。 gone则表示控件不仅不可见,而且不再占用任何屏幕空间。...一个是从里往外撑,一个是从外往里撑 ScrollView ScrollView滚动视图是指当拥有很多内容,屏幕显示不完,需要通过滚动跳来显示的视图。ScrollView只支持垂直滚动。...,LinearLayout写布局 3、上述两个控件可以互相嵌套 4、滚动条的位置现在的实验结果是:可以由layout_width和layout_height设定 5、ScrollView用于设置垂直滚动条...); v.setTag(viewHolder); // 将ViewHolder存储View中 } else { v = convertView; viewHolder = (ViewHolder

1.5K90

A021-列表容器之GridView

上面的运行结果就是GridView的典型效果,每个item是一张固定大小的图片,这里让它自适应屏幕来填充完整个屏幕的宽度。...你做好的列表就会显示你列表的最下面 14.android:transcriptMode=”alwaysScroll” //当你动态添加数据,列表将自动往下滚动最新的条目可以自动滚动到可视范围内 15....; } } } Activity中我们做了以下几件事: 1、初始化控件 2、定义图片资源mThumbIds 3、定义ImageAdapter 上面代码中我们用到了ImageLoader...这个图片加载框架,使用它来加载本地drawable资源,实际开发中一般不会这样用,我们传进去的uri是一个图片网络地址,具体的使用方法可以百度学习,这里简单介绍步骤: 1、 初始化ImageLoader...配置 2、获取ImageLoader实例,调用displayImage方法异步加载图片 最后 GridView的用法与ListView类似,都需要设置Adapter来填充数据,除了填充数据之外,我们可能还需要添加每一项的点击事件

74630

Material Design 实战 之第四弹 —— 卡片布局

其中, scroll 表示当RecyclerView向上滚动,Toolbar会跟着一起向上滚动并实现隐藏; enterAlways 表示当RecyclerView向下滚动...由于各张水果图片的长宽比例可能都不一致,为了让所有的图片都能填充满整个ImageView,这里使用了centerCrop模式,它可以让图片保持原有比例填充满ImageView,并将超出屏幕的部分裁剪掉。...其中, scroll表示当RecyclerView向上滚动,Toolbar会跟着一起向上滚动并实现隐藏; enterAlways表示当RecyclerView向下滚动,Toolbar会跟着一起向下滚动并重新显示...又会根据当前滚动的距离情况,做出消失或者重新出现的反应; 这其实也是MaterialDesign中的一项重要设计思想,因为当用户向上滚动RecyclerView的时候,注意力肯定是RecyclerView...的内容上面的,这个时候如果Toolbar还占据着屏幕空间,就会在一定程度上影响用户的阅读体验,而将Toolbar隐藏则可以让阅读体验达到最佳状态

2K10

Android UI 中的 ListView列表控件的示例

当程序中有大量的数据需要展示,就需要用到 ListView 啦。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动屏幕内,同时屏幕上原有的数据则会滚动屏幕。...另外又重写了 getView() 方法,这个方法每个子项被滚动屏幕内时会被调用。...定制 ListView 界面 3 提升运行效率 目前运行效率是很低的,有以下原因: CatAdapter 的 getView() 方法中,每次都将布局重新加载了一遍,当 ListView 快速滚动...点击事件 我们来实践 ListView 中响应用户的点击事件。...cat.getName(), Toast.LENGTH_SHORT).show(); } }); 这里为 ListView 注册了一个监听器,当用户点击了 ListView 中的任一个子项就会回调

1.5K20

Android 自定义 HorizontalScrollView 打造多图片OOM 的横向滑动效果(实例代码)

存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会...OOM(ViewPager内部一直初始化,回收,至多只保持3个View)。...2、自定义HorizontalScrollView 思想: 1、首先根据屏幕的大小和Item的大小,计算可以一个屏幕最多可以加载多少个Item,然后加载该数量Item。...2、当用户右滑(从右向左),滑动到一定距离,加载下一张,删除第一张 3、当用户左滑(从左向右),滑动到一定距离,加载上一张,删除最后一张 看下最后的效果图: ?...class MyHorizontalScrollView extends HorizontalScrollView implements OnClickListener { /** * 图片滚动的回调接口

1.8K20

浅谈RecyclerView的性能优化

ViewCacheExtension:mViewCacheExtension又称拓展缓存,为开发者预留的缓存池,开发者可以自己拓展回收池,一般不会用到。...RecyclerView的回收原理 (1)如果是RecyclerView不滚动情况下缓存(比如删除item)、重新布局。...把屏幕上的ViewHolder屏幕分离下来,存放到Scrap中,即发生改变的ViewHolder缓存到mChangedScrap中,不发生改变的ViewHolder存放到mAttachedScrap中...(2)如果是RecyclerView滚动情况下缓存(比如滑动列表),滑动填充布局。 先移除滑出屏幕的item,第一级缓存mCachedViews优先缓存这些ViewHolder。...当程序走到onBindViewHolder方法,数据应当是准备完备的,禁止onBindViewHolder方法里面进行数据获取的操作。 3.有大量图片时,滚动停止加载图片,停止后再去加载图片。

1.7K10

Android使用HorizontalScrollView实现水平滚动

它们不同的是 HorizontalScrollView 用于添加水平滚动,而 ScrollView 用于添加垂直滚动。 突然间想到 做一个屏幕下方水平滑动,屏幕上方并作出相应的反应的效果。...只是在下方滚动屏幕上方没有作出理想的反应,点击事件倒是实现了。最终只能在网上搜索,终于找到了一个。于是作出的效果如下: ?...只是这个效果还有所缺陷,加载了 13 张图片,屏幕下方水平滚动到最后一页,第 9 张的图片并没有在上面的显示出来(原作者的也有这个问题);如果图片的数量小于或者等于 4 张则不能运行。...类提供接口、水平滚动屏幕上方的反应及相应的点击事件等。...mCountOneScreen = screenWidth / mChildWidth + 2; 我的模拟器上计算得出的结果等于 5,也就是为什么不能加载小于等于 4 张图片,如果想要让该屏幕底部上只显示

3.1K20

android 自定义gallerey并实现预览功能

存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会...OOM(ViewPager内部一直初始化,回收,至多只保持3个View)。...自定义HorizontalScrollView 思想: 1、首先根据屏幕的大小和Item的大小,计算可以一个屏幕最多可以加载多少个Item,然后加载该数量Item。...2、当用户右滑(从右向左),滑动到一定距离,加载下一张,删除第一张 3、当用户左滑(从左向右),滑动到一定距离,加载上一张,删除最后一张 public class MyHorizontalScrollView...mContainer.addView(view, 0); view.setOnClickListener(this); //水平滚动位置向左移动

85150

再也不用担心面试官问RecycleView了

(屏幕外),保存最近移出屏幕ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动,能直接复用ViewHolder...所以「完整缓存流程」是: 保存缓存流程: 插入或是删除itemView,先把屏幕内的ViewHolder保存至AttachedScrap中 滑动屏幕的时候,先消失的itemview会保存到CacheView...然后新出现的position=7的数据通过postionmCacheViews中找不到对应的ViewHolder,通过itemtype也mRecyclerPool中找不到对应的数据,所以会调用onCreateViewHolder...再往下滑一条数据(position=10),这时候由于可以mRecyclerPool中找到相同viewtype的ViewHolder了。...也就是说当它嵌套在NestedScrollView中,默认会随着NestedScrollView滚动滚动,放弃了自己的滚动。所以给我们的感觉就是滞留、卡顿。

1.4K20
领券