首页
学习
活动
专区
圈层
工具
发布

RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?

在分析具体更新逻辑之前,可以先做一个总结: RecyclerView 使用观察者模式刷新自己,刷新即是通知所有的观察者。...真正的刷新 回看一下onChange()中刷新列表的具体逻辑: public class RecyclerView { private class RecyclerViewDataObserver...总结 RecyclerView 使用观察者模式刷新自己,刷新即是通知所有的观察者。 观察者被抽象为AdapterDataObserver,它们维护在AdapterDataObservable中。...在为 RecyclerView 绑定 Adapter 的同时,一个数据观察者实例被注册给 Adapter。 RecyclerView 在真正刷新列表之前,将一切都无效化了。...RecyclerView.requestLayout()是驱动列表刷新的源头。调用该方法后,会从根视图自顶向下地进行重绘。RecyclerView 的重绘表现为重新布局所有表项。

3.9K20

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

DiffUtil 是一个用于计算两个列表之间差异的实用程序类,它可以帮助 RecyclerView 以更高效的方式更新数据。...使用 DiffUtil 可以减少不必要的全局刷新,从而提高性能,特别是在处理大量数据时。以下是使用 DiffUtil 进行数据集最小更新的步骤: 1....调用 DiffUtil.calculateDiff 使用你的 Callback 实例调用 DiffUtil.calculateDiff,它将计算旧列表和新列表之间的差异。...使用 DiffUtil 可以显著提高数据更新的性能,因为它只会对实际发生变化的项进行更新,而不是刷新整个列表。...使用DiffUtil时常见的错误和原因 在使用 DiffUtil 进行数据集的最小更新时,以下是一些常见的错误及其原因: 错误的 areItemsTheSame实现: 原因:如果 areItemsTheSame

1.5K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android BaseQuickAdapter3.0.4版本二级列表的使用及遇到的问题

    ——《微卡智享》 本文长度为3942字,预计阅读9分钟 前言 前阵子做的新产品用使用BaseQuickAdapter中的basemultiitemquickadapter来实现二级列表,网的这个相关的资料也挺多...,使用的版本是2.9.4,在使用中发现当二级列表展开时对子列表数据进行操作后,列表中展开和闭合显示的数据会异常。...代码实现 微卡智享 在2.x版本中,使用多级列表用的BaseMultiItemQuickAdapter,定义的类要继承自MultiItemEntity,现在3.0版本中,我使用的是BaseNodeAdapter...payload进行增量刷新(避免整个item刷新导致的闪烁,不自然) getAdapter()!!....,完整的ViewModel代码 class DataViewModel: ViewModel() { val DataList = MutableSharedFlow<MutableList<

    4.1K30

    Android基于DataBinding封装RecyclerView实现快速列表开发

    前言 在移动应用开发中,列表组件是一个非常常见的 UI 组件,绝大多数应用开发中都会使用到列表组件进行界面的开发,在 Android 开发中列表组件一般使用官方提供的 RecyclerView ,而...RecyclerView 的常规开发需要手动创建对应的 Adapter、ViewHolder 代码,且每个 RecyclerView 的使用都需要编写这种的样板代码,存在重复代码,降低了开发效率,于是为了提高列表的开发效率...3.3 简单使用 先看一下结合 MVVM 架构如何快速实现简单的列表数据显示以及列表数据更新功能。...3.3.1 准备列表数据 先创建一个 ViewModel 用于存放列表的数据,这里主要演示列表的开发就直接用一个普通的类而不是 Jetpack 的 ViewModel 库,代码如下: class RecycleViewModel...3.3.5 数据更新 列表数据已经展示出来了,但却是静态数据,那么如何实现列表数据的动态更新呢,这就需要用到 DataBinding 提供的可观察者对象 Observable ,它是一个数据容器,里面存放的是我们需要的实际数据

    3.5K30

    MVVM架构之自动增删改的极简RecycleView的实现

    如何实现单条item刷新以及增减Item的自动刷新呢?今天我就要给大家带来一种方便的高解耦度的解决方案。 1.了解几个工具类 我们先来看几个我制作的工具类,这几个工具类可以一直复用。...- 1.select(ItemView itemView, int position, T item):这个方法是开发者自己实现的,item这个字段是咱么列表Item的ViewModel,里面储存着到底当前列表...所以当我们传入的List是这个类型的时候,adapter就会将这个监听器传入ObsrvableList中,一旦我们对数据源进行增删,那么该监听器的相应方法就会被调用,刷新我们的列表。...,我就试过ViewModel中不使用Context,最后发现Activity和ViewModel中多了许多奇怪的代码,这个我会在之后的MVVM架构中深入讲解。...我们可以构造一个BaseActivity,然后所有的ViewModel中都只传入BaseAcvitity,而在ViewModel中95%的需要使用Activity的操作,都是不需要了解Activity的实际类型的

    2.4K72

    高效开发 MVVM 和 databinding 你需要使用的工具

    我们用常见的下拉刷新控件 PullToRefreshLayout 来举例子。...实例,PullToRefreshLayout 是一个刷新列表控件,我们通过使用 ReplyCommand 监听下拉刷新和上拉加载的监听器是这样写的: @BindView(R.id.refresh_listview...来处理控件的各种事件,这里使用的是无参无返回值的最简单的情况,我们在 ViewModel 和 xml 中的写法是和之前的接口差不多的: public final ReplyCommand onRefreshCommand...这样我们就绑定好了这个列表控件的多布局逻辑了。一个空数据时候的布局,一个正常返回数据时候的布局。...那么我们的数据是如何刷新的呢,这就要用到上面的items这个属性了,在我们这个例子里,它是这样定义的: public final ObservableList viewModels =

    1.5K90

    高效开发 MVVM 和 databinding 你需要使用的工具

    实例,PullToRefreshLayout 是一个刷新列表控件,我们通过使用ReplyCommand监听下拉刷新和上拉加载的监听器是这样写的: 我们使用统一的ReplyCommand来处理控件的各种事件...,这里使用的是无参无返回值的最简单的情况,我们在 ViewModel 和 xml 中的写法是和之前的接口差不多的: 这样,我们所有事件的接口就统一了。...下面举一个 RecyclerView 的例子。我们现在 xml 中定义一个 RecyclerView 控件。...我们先来看一下itemBinding是干什么用的,我们知道有时候列表项是可能多布局的,那么这个itemBinding就是用来处理每种布局和对应 item 的 ViewModel 的绑定关系的。...那么我们的数据是如何刷新的呢,这就要用到上面的items这个属性了,在我们这个例子里,它是这样定义的: public final ObservableList viewModels =

    85620

    kotlin--综合运用Hilt、Paging3、Flow、Room、Retrofit、Coil等实现MVVM架构

    Jason老师的辛勤付出,动脑学院在B站上也有投稿koltin基础的视频,通过视频可以快速学习和上手kotlin 今天来综合使用各种组件,搭建最新MVVM项目框架,利用Paging3实现列表功能,Paging3...@Provides:告诉Hilt如何获取具体实例 @Singleton:单例 @ViewModelInject:通过构造函数,给ViewModel注入实例 1.Application注入HiltAndroidApp...Model层的架构搭建完毕后,我们需要ViewModel层与Model层作数据交互 Hilt注入ViewModel构造函数 ViewModel中需要Repository对象作为属性,而Hilt支持使用...).asLiveData() } 七、Adapter与Coil ViewModel完成后,接下来需要RecyclerView的Adapter,这块和之前的Paggin3一样 1.布局文件 <?...添加扩展函数 为了后续Paging的使用,为RecyclerView添加设置Adapter和liveData的扩展函数: fun RecyclerView.ViewHolder, T : Any

    4.3K31

    支持MVVM的BRVAH来了!

    使用本控件的前提,项目使用MVVM开发模式,列表适配器是使用BRVAH的 BaseRecyclerViewAdapterHelper万能适配器(本控件支持非使用AndroidX和使用AndroidX的条件...多布局实现,item不实现MultipleItem的调用方式 如何用databinding模式添加多个头部和脚部,并且有各自事件 空布局及下拉刷新 侧滑删除 长按拖动 侧滑删除和长按拖动相结合 ExpandableItem...,可扩展的多布局使用 下拉刷新,上拉加载 仿聊天界面,从下到上加载数据 双列表使用,仿外卖(甚至可以更多列表) 支持使用自己的适配器来调用 支持列表侧滑 地址 废话不多说,先上Github的demo。...然后大家可以看BaseBindingViewModel这个类,这个是viewModel的基类,里面将一些属性和方法定义,还有仿网络请求的动作跟列表结合。后面边写边解释。...首页列表调用方式: 非常简单,这个是Activity的内容,只要绑定viewModel,然后调用model.load(),加载列表的数据就可以了 class MainActivity : AppCompatActivity

    1.5K20

    构建Recyclerview DSL

    此框架已经在我的项目中大规模使用,并且极大地提高了Recyclerview列表构建效率和复用能力。...这是一个大概的效果,Recyclerview DSL中,我们可以用DSL的风格去配置Item被如何加入到Rec,各个Item的风格是什么样子,具有很大的灵活性和拓展性。...DSL的语法特性拓展,基本上在这里表现。 那怎么用? 定义列表要用的Item(可以全局复用 所以要好好设计) 写一个 MutableList的拓展 开始使用! 举个栗子?...如果你是要对列表进行全量刷新,可以直接使用 refreshll方法,此方法会清除列表然后再添加新的Item,当然这个过程是有DiffUtil参与的。...,只要我们把 OnCreateVH, OnBindVH的逻辑代理出去,就可以把一类Item的视图部分进行完整的解耦。

    1.2K10

    “终于懂了“系列:Jetpack AAC完整解析(五)DataBinding 重新认知!

    App内页面和控件数量繁多,一个控件可能会多处调用,这就会有出现空指针的可能,那如何完全避免呢?...那控件是如何做到被通知且更新状态的呢? DataBinding 是通过 观察者模式 来管理控件刷新状态。...1.2 例子 - 绑定列表数据 来举个例子进行说明:在页面中展示用户信息(User)列表,同时还有两个按钮用于添加、移除用户: 的所展示的列表数据, 是通过Adapter 对每一项数据 分别进行设置的,也就是说User是绑定到 Item的xml中: ViewModel 和 Repository 之间,建议 使用 LiveData 进行通信,就像 View 和 ViewModel 之间那样 使用回调的话,可能会有内存泄漏的风险。

    2K10

    JetPack--Paging2

    Paging是一个用于分页加载的组件,对于一些列表数据,以前大家都使用过的一种方式是定义一个page,当达到加载更多条件时,page加一再去请求数据,为此我们要写很多重复的代码,Paging就对分页进行了一个封装...:RecyclerView的adapter需要继承它,内部做了一系列处理 一、Paging上手 1.PositionalDataSource PositionalDataSource适合于从任意位置获取数据的情况...的Adapter,继承于PagedListAdapter,内部还需要需要一个diffCallback,用来刷新数据用: package com.aruba.paging.adapter; import...,效果和上面是一样的 3.ItemKeyedDataSource ItemKeyedDataSource使用于不固定的数据列表,如帖子,因为新增帖子比较频繁,使用上面两种可能会出现重复数据,需要参数为实体类唯一值和数据量大小...,内部会使用最后一个数据的唯一值作为下次查询的参数 package com.aruba.paging2.paging.model; import androidx.annotation.NonNull

    1.7K30

    手把手教你搭建android模块化项目框架(八)小试牛刀——带搜索列表的页面 paging,mvvm及flow的运用

    经过几期的基础封装,我们的模块化项目基本已经达到了可用的状态,那么今天就来试试开发一个带搜索的列表页面开发吧~好吧,我承认偷懒了,中间漏掉了mvvm、paging的基础封装,不过没关系,代码都在传送门至于...中的两个searchObs和posts这里是由于使用paging,我们反馈到页面上的数据均来源于room,因此我们需要使用flow的方式监听数据库数据的变动,也就是posts,可以看到posts等同于searchObs...本篇章有大量的扩展方法没有贴出,可能造成阅读困难,还是推荐clone完整项目配合文章,并自己打印log尝试理解~可能好多小伙伴并没有使用过paing,这里还是建议去了解一下,尤其是使用paging做列表的点赞...~评论等对列表有修改的地方,paging非常好用。...完整项目地址

    53820
    领券