刷新RecyclerView的一种优雅方式

当RecyclerView中的数据和数量变化时,避免刷新导致的item位置偏移和闪烁问题。通过在Adapter中重载函数,并在设置adapter时指定hasStableIds(),实现数据无缝更新,提供丝滑流畅的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://stackoverflow.com/questions/44081579/sethasstableidstrue-in-recyclerview

问题场景

在一个RecyclerView中,itemd的数据以及数量均有可能发生改变,原本仅仅在Observer中使用MyAdapter.notifyDataSetChanged(),但是出现刷新后item位置随机偏移的情况(尤其当前显示的item不为第一项,且刷新前后item数量不一样时),体验感极差,不够丝滑。
又尝试在MyAdapter.notifyDataSetChanged()前面添加MyRecyclerView.adapter=nullMyRecyclerView.adapter=MyAdapter两行,虽然不会出现item偏移而且刷新后会显示第一个item(recyclerview整个被redraw了),但是中途会有短暂的空白,也不够丝滑。

问题解决

Observer按初版不变,在MyAdapter类下重载函数

@Override
override fun getItemId(position:Int):Long{
    return position.toLong()
}

为MyRecyclerView设置adapter时加上adapter.setHasStableIds(true),比如

val adapter = MyAdapter(context)
adapter.setHasStableIds(true)
MyRecyclerView.adapter = adapter

这样刷新页面后既不会出现item偏移也不会出现闪白,数据直接丝滑地更新到当前item,并且如果刷新前在第5个item(假设共5个),刷新后的数据会是第4个item(假设刷新后共4个)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值