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

NotifyDataSetChanged会刷新RecyclerView,但也会滚动。

NotifyDataSetChanged是Android中的一个方法,用于通知RecyclerView数据集发生了变化,需要刷新界面。当调用该方法后,RecyclerView会重新绘制所有可见的Item,并更新它们的数据。

在刷新数据集的过程中,NotifyDataSetChanged可能会导致RecyclerView的滚动行为发生变化。具体来说,如果RecyclerView当前处于滚动状态,调用NotifyDataSetChanged后,RecyclerView会尝试保持当前的滚动位置不变。这意味着,如果用户正在查看RecyclerView的某个特定位置,调用NotifyDataSetChanged后,RecyclerView会尽可能地保持用户仍然能够看到相同的位置。

然而,并不是所有情况下都能完美地保持滚动位置不变。当数据集发生较大变化时,RecyclerView可能无法准确地计算出新的滚动位置,导致滚动位置的偏移或者滚动到了其他位置。这是因为RecyclerView的滚动机制是基于Item的位置来计算的,当数据集发生变化时,Item的位置也可能发生变化,从而导致滚动位置的不准确。

为了解决这个问题,可以使用RecyclerView的LayoutManager中的scrollToPosition或者scrollToPositionWithOffset方法来手动控制滚动位置。这样,在调用NotifyDataSetChanged后,可以在适当的时机调用这些方法,确保RecyclerView滚动到正确的位置。

总结一下,NotifyDataSetChanged是用于刷新RecyclerView数据集的方法,它会重新绘制所有可见的Item,并更新它们的数据。在刷新数据集的过程中,RecyclerView会尝试保持当前的滚动位置不变,但在某些情况下可能无法准确地计算出新的滚动位置。为了解决这个问题,可以使用LayoutManager的scrollToPosition或者scrollToPositionWithOffset方法来手动控制滚动位置。

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

  • 腾讯云云服务器(CVM):提供可扩展的云服务器实例,满足不同规模和需求的应用场景。详情请参考:https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务,适用于图片、音视频、文档等各种类型的数据存储。详情请参考:https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等,帮助开发者构建智能化应用。详情请参考:https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):提供全面的物联网解决方案,包括设备接入、数据管理、规则引擎等,帮助连接和管理物联网设备。详情请参考:https://cloud.tencent.com/product/iot
  • 腾讯云区块链(BCBaaS):提供安全、高效的区块链服务,支持快速搭建和部署区块链网络,满足不同行业的区块链应用需求。详情请参考:https://cloud.tencent.com/product/baas
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

3.2K20

recycleview的优化_recyclerview原理

这个机制导致一个问题,启动应用之后,在屏幕可见范围内,如果只有一张卡片可见,当滚动的时 候,RecyclerView找不到可以重用的view了,它将创建一个新的,因此在滑动到第二个feed的时候就会有一定的延时...可以用一下一些方法,替代notifyDataSetChanged,达到局部刷新的目的。...notifyDataSetChanged触发所有item的detached回调再触发onAttached回调。...()不会触发RecyclerView的动画(删除、新增、位移、change动画),其次性能较低,它不管数据是否一样都整个刷新了一遍整个RecyclerView 。...(true),是支持嵌套滚动的,也就是说当它嵌套在NestedScrollView中时,默认随着NestedScrollView滚动滚动,放弃了自己的滚动

3.8K21

浅谈RecyclerView的性能优化

RecyclerView的回收原理 (1)如果是RecyclerView滚动情况下缓存(比如删除item)、重新布局时。...(2)如果是RecyclerView滚动情况下缓存(比如滑动列表),在滑动时填充布局。 先移除滑出屏幕的item,第一级缓存mCachedViews优先缓存这些ViewHolder。...(1) 使用notifyItemChange、notifyItemInserted、notifyItemMoved和notifyItemRemoved等方法替代notifyDataSetChanged方法...这是因为setAdapter直接清空RecyclerView上的所有缓存,但是swapAdapter会将RecyclerView上的ViewHolder保存到pool中,这样当数据源相似时,就可以提高缓存的复用率...因为直接在onBindViewHolder方法中创建匿名内部类的方式来实现setOnItemClick,导致在RecyclerView快速滑动时创建很多对象。

1.7K10

Power BI模拟苹果发布滚动照片墙

日前,苹果公司举办了2021秋季产品发布。不知道你认为十三香不香,我反正准备让手上的6s继续服役。发布会上有个酷炫的滚动照片墙,其实Power BI也能做。...版本可以多种多样,下图是间隔滚动版: 双向滚动版: 变速版: 无限循环版: ‍ 实现原理是照片批量嵌入SVG,利用SVG的动画标签按照DAX指定的路径运动。...以双向滚动版为例,新建度量值: 滚动照片墙双向版 = VAR SVG_Table=ADDCOLUMNS('照片', "Image标签", "<image xlink:href='"&[URL]&"'...对于间隔滚动,只需要将by后面的if函数-800改为0;每行滚动速度不同可以将dur中的固定秒数按行单独设置;没有留白无限循环的模式读者可以想下怎么解决,想到可以留言。...这种滚动效果绝不仅仅是用来娱乐,将一些业务指标做成卡片,放在大屏滚动效果也不错。

2.3K20

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

讲一下RecyclerView的缓存机制,滑动10个,再滑回去,会有几个执行onBindView。缓存的是什么?cachedView执行onBindView吗?...讲一下RecyclerView的缓存机制,滑动10个,再滑回去,会有几个执行onBindView。缓存的是什么?cachedView执行onBindView吗?...关于RecyclerView的数据更新,主要有以下几个方法: notifyDataSetChanged(),刷新全部可见的item。*notifyItemChanged(int),刷新指定item。...这是因为RecyclerView默认是setNestedScrollingEnabled(true),这个方法的含义是支持嵌套滚动的。...也就是说当它嵌套在NestedScrollView中时,默认随着NestedScrollView滚动滚动,放弃了自己的滚动。所以给我们的感觉就是滞留、卡顿。

1.4K20

RecyclerView必知必会

Demo1: RecyclerView添加HeaderView和FooterView,ItemDecoration范例。 Demo2: ListView实现局部刷新。...但是RecyclerView的出现让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...ListView实现局部刷新 我们都知道ListView通过adapter.notifyDataSetChanged()实现ListView的更新,这种更新方法的缺点是全局更新,即对每个Item View...ArrayList[] mScrapViews;: 每个Item Type对应一个列表作为回收站,缓存由于滚动而消失的View,此处的View如果被复用,以参数的形式传给getView()...RecyclerView局部刷新的实现原理也是基于RecyclerView的回收机制,即能直接复用的ViewHolder就不调用onBindViewHolder()。

4.7K20

RecyclerView使用_recyclerview是什么

布局管理器 线性布局管理器 网格布局管理器 ItemDecoration Item 动画 Item 点击 RecyclerView使用-高级篇(上拉刷新下拉加载更多) 第一步:添加依赖 第二步:布局文件...GridLayoutManager 网格布局管理器 线性布局管理器 这三种布局管理器都是通过setLayoutManager方法来设置 LinearLayoutManager 还可以设置横向滚动,只需将前面...); 也能设置横向滚动 mRecyclerView.setLayoutManager(layoutManager); ItemDecoration 通过给 设置ItemDecoration 来装饰Item...使用-高级篇(上拉刷新下拉加载更多) 通常RecyclerView使用的时候需要配合上拉刷新下拉加载更多的功能 我们通过开源控件SmartRefreshLayout来实现 SmartRefreshLayout...= new News(); news.title = "标题 新内容" + i; news.content = "内容" + i; mNewsList.add(news); } mMyAdapter.notifyDataSetChanged

1.3K31

RecyclerView 必知必会

Demo1: RecyclerView添加HeaderView和FooterView,ItemDecoration范例。 Demo2: ListView实现局部刷新。...但是RecyclerView的出现让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...ListView实现局部刷新 我们都知道ListView通过adapter.notifyDataSetChanged()实现ListView的更新,这种更新方法的缺点是全局更新,即对每个Item View...ArrayList[] mScrapViews;: 每个Item Type对应一个列表作为回收站,缓存由于滚动而消失的View,此处的View如果被复用,以参数的形式传给getView()...RecyclerView局部刷新的实现原理也是基于RecyclerView的回收机制,即能直接复用的ViewHolder就不调用onBindViewHolder()。

4.1K90

深入浅出 RecyclerView

其中 StaggeredGridLayoutManager 第一个参数表示列数,就好像 GridView的列数一样,第二个参数表示方向,可以很方便的实现横向滚动或者纵向滚动。...使用 demo 可以查看:Github 【RecyclerView简单使用】 添加删除 item 的动画 同 ListView 每次修改了数据源后,都要调用 notifyDataSetChanged()...刷新每项 item 类似,只不过 RecyclerView 还支持局部刷新notifyItemInserted(index)、 notifyItemRemoved(position)、 notifyItemChanged...RecyclerView 的内部维护了一个二级缓存,滑出界面的 ViewHolder 暂时放到 cache 结构中,而从 cache 结构中移除的 ViewHolder,则会放到一个叫做RecycledViewPool...,但也正是因为需要被多个 RecyclerView 公用,所以我们的 ViewHolder 必须继承自同一个基类(即RecyclerView.ViewHolder)。

1.7K60

RecyclerView 必知必会

Demo2: ListView实现局部刷新。 Demo3: RecyclerView实现拖拽、侧滑删除。 Demo4: RecyclerView闪屏问题。...但是RecyclerView的出现让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...ListView实现局部刷新 我们都知道ListView通过adapter.notifyDataSetChanged()实现ListView的更新,这种更新方法的缺点是全局更新,即对每个Item View...ArrayList[] mScrapViews;: 每个Item Type对应一个列表作为回收站,缓存由于滚动而消失的View,此处的View如果被复用,以参数的形式传给getView()...RecyclerView局部刷新的实现原理也是基于RecyclerView的回收机制,即能直接复用的ViewHolder就不调用onBindViewHolder()。

2.5K70

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

本文是RecyclerView完全解析系列第三篇文章,内容是紧跟前两篇:RecyclerView基本设计结构和 RecyclerView刷新机制。...mAttachedScrap : 用来保存RecyclerView做数据刷新(notify),被detach的ViewHolder mCacheViews : Recycler的一级ViewHolder...但比较疑惑的可能就是上述ViewHolder缓存集合中什么时候保存ViewHolder。接下来分几个RecyclerView的具体情形,来一点一点弄明白这些ViewHolder缓存集合的问题。...在前一篇文章RecyclerView刷新机制中分析过,RecyclerView在滑动时会调用LinearLayoutManager.fill()方法来根据滚动的距离来向RecyclerView填充子View...,其实在个方法在填充完子View之后就会把滚动出屏幕的View做回收: int fill(RecyclerView.Recycler recycler, LayoutState layoutState,

1.7K30

Recyclerview 刷新「建议收藏」

前言:recyclerview比起listview功能上更加丰富外(如横向列表),在Item复用上也更加灵活,比如listview的某个Item数据需要更新,要通过notifyDataSetChanged...方法对全部Item进行刷新,而recyclerview则可以精准刷新。...介绍: (1)notifyItemChanged(position) 只刷新该position的Item,即只是该Item调用onBindViewHolder,因此如果对数据源进行插、移除操作不能改方法只刷新操作的...(3)notifyDataSetChanged() 全部Item进行刷新 (4)notifyItemRangeChanged(position, itemCount) 刷新position及之后ItemCount...toPosition) 移动并进行刷新 注意: 当对数据源进行移除或添加操作时需要立即执行刷新操作,将adapter内部记录的数据源状态和我们传给adapter的数据源进行同步更新,否则可能导致RecyclerView

99530

Android实现RecyclerView下拉刷新效果

本文为大家分享了Android实现RecyclerView下拉刷新效果的具体代码,供大家参考,具体内容如下 思路 RealPullRefreshView继承了一个LinearLayout 里面放置了一个刷新头布局...,将其margin_top设置为负的刷新头的高度的 再添加一个RecyclerView 触摸事件分发机制,当在特定条件下让RealPullRefreshView拦截触摸事件,否则的话,不拦截,让RecyclerView.../ public void refreshFinish() { smoothScrollBy(0, 0 - getScrollY()); getRecyclerView().getAdapter().notifyDataSetChanged...* * 当用户使用完加载更多后回调时,需要调用此方法,将STATE恢复 */ public void loadMreFinish() { getRecyclerView().getAdapter().notifyDataSetChanged..., Toast.LENGTH_SHORT).show(); } /** * 在500毫秒内平滑地滚动多少像素点 * * @param dx * @param dy */ private void smoothScrollBy

3.4K30
领券