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

具有两个视图类型的RecyclerView在滚动时不保存视图状态

是因为RecyclerView的默认行为是在滚动时回收和重用视图,以提高性能和减少内存消耗。这意味着当视图滚出屏幕时,它会被回收并用于显示新的数据项,而不会保留其状态。

要解决这个问题,可以通过以下几种方式来保存和恢复视图状态:

  1. 使用RecyclerView.Adapter的getItemViewType()方法来标识不同的视图类型。确保在适配器中正确实现此方法,并根据数据项的类型返回相应的视图类型。
  2. 在RecyclerView.ViewHolder中添加一个状态变量,用于保存视图的状态。当视图被回收时,将状态保存到ViewHolder中。在绑定视图时,从ViewHolder中恢复状态。
  3. 在RecyclerView.LayoutManager中重写以下方法来保存和恢复视图状态:
    • onSaveInstanceState():保存RecyclerView的状态。
    • onRestoreInstanceState():恢复RecyclerView的状态。
  • 在Activity或Fragment的生命周期方法中保存和恢复RecyclerView的状态。例如,在onSaveInstanceState()方法中保存RecyclerView的状态,并在onCreate()或onRestoreInstanceState()方法中恢复状态。
  • 使用第三方库,如ParcelableRecyclerView,它可以自动保存和恢复RecyclerView的状态。

在实际应用中,具有两个视图类型的RecyclerView在以下场景中可能会用到:

  • 聊天应用中的消息列表,其中包含不同类型的消息(文本、图片、视频等)。
  • 商品列表,其中包含不同类型的商品(普通商品、促销商品、热门商品等)。
  • 社交媒体应用中的动态列表,其中包含不同类型的动态(文字、图片、视频等)。

对于腾讯云的相关产品和产品介绍链接地址,可以参考以下推荐:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(Mobile):https://cloud.tencent.com/product/mobile
  • 腾讯云区块链(Blockchain):https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse

请注意,以上链接仅供参考,具体的产品选择应根据实际需求和情况进行评估和选择。

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

相关·内容

必要保存服务器控件视图状态

自动视图状态管理是服务器控件功能,该功能使服务器控件可以往返过程上重新填充它们属性值(您不需要编写任何代码)。...但是,因为服务器控件视图状态隐藏窗体字段中往返于服务器,所以该功能确实会对性能产生影响。您应该知道在哪些情况下视图状态会有所帮助,在哪些情况下它影响页性能。...例如,如果您将服务器控件绑定到每个往返过程上数据,则将用从数据绑定操作获得新值替换保存视图状态。在这种情况下,禁用视图状态可以节省处理时间。 默认情况下,为所有服务器控件启用视图状态。...当您不从页回发到服务器,这将十分有用: 注意 @ Control 指令中也支持 EnableViewState 属性,该指令允许您控制是否为用户控件启用视图状态...若要分析页上服务器控件使用视图状态数量,请(通过将 trace="true" 属性包括 @ Page 指令中)启用该页跟踪并查看 Control Hierarchy 表 Viewstate 列

62420

ViewPager中Fragment状态保存哪些事

RecyclerView 滚动位置等,EditText 输入内容 等), 或者说 View 历史状态被还原了。...重新创建后 View状态(RecyclerView滚动位置) 变化,如下所示: 因为默认缓存为 n(1)+2 ,即当我们滑动到 item=3 ,1 页面此时已被销毁。...但当我们重新切换到 1 ,可以发现,Fragment1 中 RecyclerView 滚动位置 没有变化,所以可以证明 Fragment 状态的确是被还原了。 那这是怎么做呢?...状态信息,并且以下标的方式进行了保存,当我们滑动 ViewPager ,其会加载并初始化指定 position 所对应 Fragment ,并将缓存 Fragment 状态信息 set 进去...知道了这个概念,我们也就可以自己做一些小扩展,比如我们可以部分情况下主动将我们Fragment状态保存起来,以便在后面进行恢复,也即就是使用以下两个方法即可。

1.3K20
  • 【Android从零单排系列二十五】《Android视图控件——RecyclerView

    前言 小伙伴们,在上文中我们介绍了Android视图组件Gallery,本文我们继续盘点,介绍一下视图控件RecyclerView。...addOnScrollListener(RecyclerView.OnScrollListener listener):添加滚动监听器,以便在滚动状态发生变化时执行相应操作。...与ListView相比,RecyclerView具有许多优势: 灵活性:RecyclerView提供了更高级别的自定义选项,使开发者可以灵活控制列表项布局、动画效果和交互行为。...复用机制:RecyclerView引入了ViewHolder模式,可以重复利用子项视图滚动过程中减少布局操作,提高性能。...增强布局管理器(LayoutManager):RecyclerView支持不同类型布局管理器,如线性布局、网格布局、瀑布流布局等,可以轻松实现各种列表和网格展示方式。

    35610

    浅谈RecyclerView性能优化

    众所周知,RecyclerView拥有四级缓存,它们分别是: Scrap缓存:包括mAttachedScrap和mChangedScrap,又称屏内缓存,参与滑动回收复用,只是用作临时保存变量。...CacheView缓存:mCachedViews又称离屏缓存,用于保存最新被移除(remove)ViewHolder,已经和RecyclerView分离视图,这一级缓存是有容量限制,默认最大数量为...RecyclerView回收原理 (1)如果是RecyclerView滚动情况下缓存(比如删除item)、重新布局。...(2)如果是RecyclerView滚动情况下缓存(比如滑动列表),滑动填充布局。 先移除滑出屏幕item,第一级缓存mCachedViews优先缓存这些ViewHolder。...当程序走到onBindViewHolder方法,数据应当是准备完备,禁止onBindViewHolder方法里面进行数据获取操作。 3.有大量图片时,滚动停止加载图片,停止后再去加载图片。

    1.8K10

    RecyclerView必知必会

    但是RecyclerView出现会让很多开源项目被废弃,例如横向滚动ListView, 横向滚动GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...这个问题描述是:当Item视图中有图片和文字,当更新文字并调用notifyItemChanged(),文字改变同时图片会闪一下。...那么如何在破坏原有Adapter实现情况下完成呢? 这里引入装饰器(Decorator)设计模式,该设计模式通过组合方式,破话原有类代码情况下,对原有类功能进行扩展。...ListView提供了setEmptyView()设置Adapter数据为空View视图。...此方法中可以做一些状态变化时处理,比如拖拽时候修改背景色。 clearView(): 用户交互结束回调。此方法可以做一些状态清空,比如拖拽结束后还原背景色。

    4.7K20

    Android面试题之如何截取Activity或者Fragment内容?

    截取某个Activity或Fragment Android中,如果你想要截取某个Activity或Fragment页面内容并保存成图片,可以通过以下方法实现: 1、 截取整个Activity屏幕:...你可以获取当前Activity视图(decorView),然后利用setDrawingCacheEnabled(true)和buildDrawingCache()方法来启用视图绘制缓存,并创建一个...3、 滚动RecyclerView: 使用scrollTo()或scrollBy()方法将RecyclerView滚动到顶部,然后逐屏截取内容,直到覆盖整个RecyclerView高度。...4、 绘制每个屏幕内容: 滚动过程中,每次RecyclerView滚动到新屏幕位置,使用draw()方法将当前屏幕内容绘制到Canvas上。...请注意,这个过程可能需要一些时间来完成,因为它涉及到滚动和绘制操作。此外,这个方法没有考虑到RecyclerView复杂布局和可能异步加载问题,因此实际应用中可能需要进一步调整和优化。

    7910

    Facebook构建高性能Android视频组件实践之路

    资源回收利用 Android内置RecyclerView可以基于视图类型将其保存在不同缓存池中,这对于创建了很多不同类型视图用户界面来说可能会是一个问题。...当两个视频新闻同时出现在屏幕上也需要注意:一个视频视图可以从以前新闻中回收,但是第二个视图需要新建。...当RecyclerView需要分配一个新视图对象,特别是像视频视图那样复杂视图,会带来丢帧风险。我们希望优化这种情况,因此我们Litho中创建了预分配功能。...当滚动浏览新闻提要中第一个视频新闻,预分配视频视图可以极大地提高滚动性能。...当RecyclerView适配器被更新,它可以重新绑定所有的子视图,并获得所有可见组件并重新加载(触发onUnmount和onMount)。

    1.6K100

    RecyclerView 必知必会

    但是RecyclerView出现会让很多开源项目被废弃,例如横向滚动ListView, 横向滚动GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...这个问题描述是:当Item视图中有图片和文字,当更新文字并调用notifyItemChanged(),文字改变同时图片会闪一下。...那么如何在破坏原有Adapter实现情况下完成呢? 这里引入装饰器(Decorator)设计模式,该设计模式通过组合方式,破话原有类代码情况下,对原有类功能进行扩展。...添加setEmptyView ListView提供了setEmptyView()设置Adapter数据为空View视图RecyclerView虽然没提供直接API,但是也可以很简单地实现。...此方法中可以做一些状态变化时处理,比如拖拽时候修改背景色。 clearView(): 用户交互结束回调。此方法可以做一些状态清空,比如拖拽结束后还原背景色。

    4.2K90

    【基本功】Litho使用及原理剖析

    Litho是高效构建Android UI声明式框架,通过注解API创建高优Android视图,非常适用于基于Recyclerview复杂滚动列表。...Litho中每一个组件都是一个独立功能模块。Litho组件和React组件相类似,也具有属性和状态概念,通过状态变更来控制组件展示样式。...3.3 扁平化视图 使用Litho布局,我们可以得到一个极致扁平视图效果。它可以减少渲染递归调用,加快渲染速度。 下面是同一个视图Android和Litho实现下视图层级效果对比。...3.4.1 原生RecyclerView复用原理剖析 原生RecyclerView视图按模板类型进行存储并复用,也就是说模板类型越多,所需存储模板种类也就越多,导致内存占用越来越大。原理如下图。...使用细粒度复用RecyclerView缓存池不再需要区分模板类型来缓存大量视图模板,只需要缓存LithoView容器。细粒度回收视图单元数量要远远小于原来缓存在各个视图模板中视图单元数量。

    2.1K10

    RecyclerView 必知必会

    但是RecyclerView出现会让很多开源项目被废弃,例如横向滚动ListView, 横向滚动GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...这个问题描述是:当Item视图中有图片和文字,当更新文字并调用notifyItemChanged(),文字改变同时图片会闪一下。...那么如何在破坏原有Adapter实现情况下完成呢? 这里引入装饰器(Decorator)设计模式,该设计模式通过组合方式,破话原有类代码情况下,对原有类功能进行扩展。...添加setEmptyView ListView提供了setEmptyView()设置Adapter数据为空View视图RecyclerView虽然没提供直接API,但是也可以很简单地实现。...此方法中可以做一些状态变化时处理,比如拖拽时候修改背景色。 clearView(): 用户交互结束回调。此方法可以做一些状态清空,比如拖拽结束后还原背景色。

    2.6K70

    Material Design初露锋芒之复杂视图轻松实现

    Fragment中显示标题栏,并为该标题栏添加菜单。 Fragment嵌套Fragment。 一行代码解决RecyclerView视图滚动冲突。...第一个Fragment需要有一个带菜单沉浸式头部视图(带图片)以及一个ViewPager,该ViewPager包含两个子Fragment。...传统解决方案 传统解决方案主要需要解决这些问题: 1.头部图片与标题栏伸缩协调; 2.标题栏与状态沉浸式协调及版本适配; 3.滚动视图事件冲突。...使用Martial Design优雅实现 要点解读 // 保存ViewPager中Fragment状态 mViewPager.setOffscreenPageLimit(mFragments.size...等视图滚动冲突,具体请看[源码](https://github.com/XunMengWinter/MaterialShow/tree/master) 。

    91120

    CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar-Android M新控件

    滚动事件,那么CoordinatorLayout布局里其它标记了app:layout_behavior子View(LinearLayout、RecyclerView、NestedScrollView...enterAlwaysCollapsed 当你视图已经设置minHeight属性又使用此标志,你视图只能已最小高度进入,只有当滚动视图到达顶部才扩大到完整高度 exitUntilCollapsed...– (Tab宽度平均分配),也实现了可滚动选项卡 – (Tab宽度固定,同时可以横向滚动),还实现了所有Tab居中显示。...tabMode —Tab模式,有固定和滚动两个模式,分别为 fixed 和 scrollable。 tabTextColor —设置默认状态下Tab上字体颜色。...布局下包裹一个可以滑动布局,比如 RecyclerView,NestedScrollView(经过测试,ListView,ScrollView不支持)具有滑动效果组件。

    2.1K30

    【Android从零单排系列二十六】《Android视图控件——ScrollView》

    前言 小伙伴们,在上文中我们介绍了Android视图组件RecyclerView,本文我们继续盘点,介绍一下视图控件ScrollView。...一 ScrollView基本介绍 ScrollView是Android平台上一个可滚动视图容器,它用于一个可滚动区域内显示大量内容。...-- 在这里添加您内容视图 --> ScrollView内部添加内容视图ScrollView标签内部,可以放置各种UI组件来展示要滚动内容。...android:fadeScrollbars:控制滚动条是否活动状态渐隐。设置为true表示滚动条会渐隐,默认为false。...处理大数据集或需要与后端交互情况下,推荐使用RecyclerView等更高级容器组件来动态加载和展示数据,从而提供更好性能和用户体验。

    41820

    已中招!Android 基础面试常常吊死在这几个问题上……

    Standard 是默认,就是指定启动模式时候用到是这个!其他指定时候使用! 面试官:你糊弄我呐?...但是通过这种方式,当您到达列表末尾,将创建100个视图,并且内存使用情况将与第一种方法相同。创建视图需要花费时间,因此您滚动很可能不会很流畅。...这就是为什么 RecyclerView 会利用以下事实:滚动,新行出现在屏幕上,而旧行消失屏幕上。代替为每个新行创建新视图,而是通过将新数据绑定到旧视图来对其进行回收和重用! 应聘者:我学到了!...ViewHolder模式:Recyclerview实现了ViewHolders模式,但在ListView 中不是必需RecyclerView 滚动回收并重用单元格。...LayoutManager: ListView 中,唯一可用视图类型是垂直ListView。

    2K20

    手把手教你打造RecyclerView滚动特效

    100% 通过右侧小滑块底部与Item顶部之间距离占两个Item高度百分比作为process值: ?...RecyclerView初始情况 我们可以将RecyclerView初始情况设想如上图,此时turningLine值为0。当RecyclerView滑动: ?...RecyclerView总高度(包含不可见部分)与RecyclerView可见部分高度相差得到;而scrollY则随着RecyclerView滚动变化,因此需要对RecyclerView进行滚动事件监听...与RecyclerView滚动建立了关系;至此,动画与RecyclerView逻辑关系梳理完毕。...当RecyclerView滑动太快,单位滚动距离内,滚动监听事件触发频率较低,导致有些Item动画进度未达到100%便从屏幕中消失,从而存在重新滚动到那个Item,Item动画停留在1%~99%

    2.6K10

    View 上使用挂起函数

    Android 视图  回调 Android 视图系统中尤其热衷于使用回调: 目前 Android Framework 中,view 和 widgets 类中回调有 80+ 个, Jetpack...最常见用法有以下几项: AnimatorListener 获取动画结束相关事件 RecyclerView.OnScrollListener 获取滑动状态变更事件 View.OnLayoutChangeListener...我们推荐始终使用 suspendCancellableCoroutine(),因为这个方法可以从两个维度处理协程取消操作: #1: 可以异步操作完成之前取消协程。...) 就是 Fragment 中 viewLifecycleOwner,只要加载了 Fragment 视图,它就会处于活跃状态。...但是这里使用方法适用于不同类型异步操作: 我们使用一个 ValueAnimator,一个 RecyclerView 平滑滚动,以及一个 Animator 来举例: viewLifecycleOwner.lifecycleScope.launch

    2.3K30

    自定义 Behavior,实现嵌套滑动、平滑切换周月视图日历

    布局中,对子控件配置 app:layout_behavior 属性,实现对应联动效果。所以这里我们需要自定义日历和列表两个 Behavior。 Behavior 有两种实现联动方式。...= 0; } onNestedPreScroll 这个方法是准备滚动之前调用,它带有滚动偏移量 dy。...滚动,日历也向上滚动,最多到当前选中日期那一行,滚动范围和当前选中日期有关。...惯性滑动 上面效果可以看出一个问题,当滑动到一半时候松手,应该要恢复到完整视图位置。这里包含了,快速滑动后惯性滑动到指定位置效果,和没有快速滑动,往就近指定位置滑动这两种效果。...由于我们滚动折叠效果是 onNestedPreScroll 实现,所以要想办法触发这个方法。

    3.3K10

    RecyclerView技术栈参考资料:

    (能够在有限窗口中展示大数据集合灵活视图。) 所以我们能够理解为,RecyclerView一个恰当使用场景是:由于尺寸限制,用户设备不能一次性展现所有条目,用户需要上下滚动以查看更多条目。...滚出可见区域条目将被回收,并在下一个条目可见时候被复用。 我们可以从下图中得到更直观解释: ? 左边图是数据初始化后示例,当向上滚动视图时候,当条目不可见之后将被回收。...定制Item条目 - ListView只能实现垂直线性排列列表视图,与之不同是,RecyclerView可以通过设置RecyclerView.LayoutManager来定制不同风格视图,比如水平滚动列表或者不规则瀑布流列表...设置数据源 - LisView中针对不同数据封装了各种类型Adapter,比如用来处理数组ArrayAdapter和用来展示Database结果CursorAdapter。...,我们可以通过以下代码为Item增加动画效果: recyclerView.setItemAnimator(new DefaultItemAnimator()); 之前版本中,当时据集合发生改变,我们通过调用

    1.2K10

    Android实战经验之如何通过调整RecyclerView缓存来优化滚动性能

    RecyclerView 中,setMaxRecycledViews 方法用于设置 RecycledViewPool 缓存大小,这是一个重要性能优化手段。...RecycledViewPool 允许多个 RecyclerView 实例共享一个公共缓存池,这在有多个 RecyclerView 使用相同视图类型适配器非常有用,比如在使用 ViewPager...显示相同类型项目视图。...相反,如果你知道屏幕上同时会有多个相同类型 ViewHolder,增加池大小可以减少需要重新绑定数据次数,从而提高滚动性能。...总的来说,合理配置 RecycledViewPool 大小和共享机制,可以显著提高 RecyclerView 性能和滚动流畅度。 END 点赞转发,让精彩不停歇!

    9410
    领券