Recyclerview 刷新「建议收藏」
前言:recyclerview比起listview功能上更加丰富外(如横向列表),在Item复用上也更加灵活,比如listview的某个Item数据需要更新,要通过notifyDataSetChanged方法对全部Item进行刷新,而recyclerview则可以精准刷新。
介绍:
(1)notifyItemChanged(position)
只刷新该position的Item,即只是该Item调用onBindViewHolder,因此如果对数据源进行插、移除操作不能改方法只刷新操作的Item,毕竟该Item之后的Item的position都发生了改变
(2)notifyItemChanged(int position, Object payload)
对position的Item进行局部刷新,在onBindViewHolder(ContentViewHolder viewHolder, int position, List<Object> payloads)中根据payloads.get(position)值只对需要刷新的控件进行操作
(3)notifyDataSetChanged()
全部Item进行刷新
(4)notifyItemRangeChanged(position, itemCount)
刷新position及之后ItemCount个Item
(5)notifyItemInserted(position)
插入并进行刷新
(6)notifyItemRangeInserted(int position, int itemCount)
从position开始插入itemCount个Item并进行刷新
(7)notifyItemRemoved(int position)
移除并进行刷新
(8)notifyItemRangeRemoved(int position, int itemCount)
从position开始移除itemCount个Item并进行刷新
(9)notifyItemMoved(int fromPosition, int toPosition)
移动并进行刷新
注意:
当对数据源进行移除或添加操作时需要立即执行刷新操作,将adapter内部记录的数据源状态和我们传给adapter的数据源进行同步更新,否则可能会导致RecyclerView报如下异常,同时还没有我们应用异常堆栈信息
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{89b9fcf position=1 id=-1, oldPos=1, pLpos:-1 scrap [attachedScrap] tmpDetached no parent}
android.support.v7.widget.RecyclerView{d9e5733 VFED..... ......ID 0,0-1080,364 #7f0903a2 app:id/rv_shop_bag_list}, adapter:com.lpf.demo.order.adapter.MyAdapter@5f994d1,
layout:android.support.v7.widget.LinearLayoutManager@1423b36, context:com.lpf.demo.activity.MainActivity@f8937f9
at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3875)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1877)
at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:407)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1029)
at android.view.Choreographer.doCallbacks(Choreographer.java:841)
at android.view.Choreographer.doFrame(Choreographer.java:769)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1015)
at android.os.Handler.handleCallback(Handler.java:794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
这里列举一种导致该异常的例子
错误:
val list = mutableListOf("第1条", "第2条", "第3条", "第4条")
list.removeAt(0)
mAdapter.notifyItemRangeChanged(0, list.size)
正确:
val list = mutableListOf("第1条", "第2条", "第3条", "第4条")
val size = list.size
list.removeAt(0)
mAdapter.notifyItemRangeChanged(0, size)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/234607.html原文链接:https://javaforall.cn
相关文章
- shellcode免杀「建议收藏」
- 使用Golang实现PHP的Addslashes和Stripslashes「建议收藏」
- 使用Pycharm运行TensorFlow,Virtualenv安装TensorFlow「建议收藏」
- Vue父子组件传值的Demo「建议收藏」
- mysql数据库SQL查询语句SELECT详细查询(超详细)「建议收藏」
- python 下载m3u8视频「建议收藏」
- 三分钟实现微信小程序轮播图「建议收藏」
- PCI PCI-X PCI-E区别「建议收藏」
- 编程开发工具一览:新手到大神,程序员都用什么写代码?「建议收藏」
- 惠普服务器磁盘阵列配置及故障修复「建议收藏」
- [Protel99SE]打印PDF「建议收藏」
- Java三大器之拦截器(Interceptor)的实现原理及代码示例「建议收藏」
- C# 读写 Photoshop PSD文件 操作类「建议收藏」
- Tomcat7.0安装配置详细(图文)「建议收藏」
- route命令「建议收藏」
- html超链接样式「建议收藏」
- java 队列方法详解「建议收藏」
- XLSTransformer+模板 导出 Excel「建议收藏」
- Android ListView下拉/上拉刷新:设计原理与实现「建议收藏」
- zencart 引用模板语句「建议收藏」
- vue项目如何刷新当前页面「建议收藏」
- 彻底解决鼠标单击变双击问题的方法(图例)「建议收藏」
- Actuator「建议收藏」
- pycharm配置pytorch的坑以及解决方案「建议收藏」
- 【STM32F407的DSP教程】第48章 STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)「建议收藏」
- KEIL_MDK生成Bin文件「建议收藏」
- Generic Host process for Win32 service 解决办法「建议收藏」
- TD-SCDMA的优势「建议收藏」
- 更换conda源和pip源「建议收藏」
- idea springboot启动报SLF4J:Failed to load class “org.slf4j.impl.StaticLoggerBinder”「建议收藏」