<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
除非必要,應該儘可能避免呼叫notifyDataSetChanged()
去重新整理RecyclerView
列表 ,這會對效能造成影響,所以RecyclerView.Adapter
還提供了一下幾個方法:
private fun recycleViewRelated() { mAdapter.notifyItemChanged() mAdapter.notifyItemRangeChanged() mAdapter.notifyItemInserted() mAdapter.notifyItemRangeInserted() mAdapter.notifyItemRangeRemoved() mAdapter.notifyItemRemoved() }
notifyItemXXXChanged()
:通知指定索引的item呼叫onBindViewHolder()
重新整理介面
notifyItemXXXInserted()
:通知在指定索引處插入item,即插入ViewHolder,有可能複用,有可能重新呼叫onCreateViewHolder()
建立
notifyItemXXXRemoved()
: 通知移除指定索引的item,即移除ViewHolder,並根據情況放到大家瞭解的1級mAttachedScrap
快取或3級快取RecycledViewPool
中
上面的幾個情況大家根據情況呼叫,請注意呼叫上面單刷方法時,同樣要保證RecyclerView
資料來源也進行了插入/刪除/更新操作
,否則可能會引發不必要的異常。
有時候,某個子Item對應的佈局比較複雜,且每次重新整理只可能會重新整理其中一部分,這個時候使用上面介紹的單刷就會重新整理到子item中不必要重新整理的部分,這個時候我們可以藉助payload
實現單刷Item中的某一部分內容。
接下來介紹兩種方式,假設當前Item佈局如下,當前只想重新整理頂部內容
:
這個主要是藉助帶payload
引數的notifyItemXXXRemoved/Changed/Inserted()
方法+帶payloads
引數的onBindViewHolder()
方法實現,接下來我們來看程式碼實操。
我們用1、2、3分別來標識Item的頂部、中部和底部對應佈局內容,目前我們只想重新整理標識為1對應的頂部內容:
mAdapter.notifyItemChanged(0, 1)
上面程式碼就代表著重新整理下標為0對應item佈局的頂部內容,接下來我們在onBindViewHolder()
中處理:
override fun onBindViewHolder( holder: RecyclerView.ViewHolder, position: Int, payloads: MutableList<Any> ) { if (payloads.isEmpty()) { super.onBindViewHolder(holder, position, payloads) return } when(payloads[0]) { //重新整理頂部內容 1 -> {} //重新整理中部內容 2 -> {} //重新整理底部內容 3 -> {} } }
得用帶有如上payloads
引數的onBindViewHolder()
才能處理通過notifyItemChanged()
最後一個引數傳遞過來的payload
引數。
請注意當payloads
集合引數為空時,要主動呼叫super.onBindViewHolder(holder, position, payloads)
保證單item的整體重新整理。
ListAdapter
是基於DiffUtil
實現列表中部分item重新整理的,具體的使用這裡不做過多介紹。
當我們繼承ListAdapter
自定義一個介面卡時,要傳入一個DiffUtil.ItemCallback
物件,這個物件有個getChangePayload()
方法,這裡就是實現item中區域性內容重新整理的關鍵。
private class InnerAdapter2 : ListAdapter<String, RecyclerView.ViewHolder>(object : DiffUtil.ItemCallback<String>() { override fun areItemsTheSame(oldItem: String, newItem: String): Boolean { } override fun areContentsTheSame(oldItem: String, newItem: String): Boolean { } override fun getChangePayload(oldItem: String, newItem: String): Any? { return super.getChangePayload(oldItem, newItem) } })
我們只需要對上面的getChangePayload()
方法重寫,根據資料變更的範圍來決定重新整理item的頂部、中部還是底部。
override fun getChangePayload(oldItem: String, newItem: String): Any? { val list = mu //如果資料變更會影響item頂部內容顯示,則返回1重新整理item頂部內容 if (oldItem != newItem) { return 1 } //如果資料變更會影響item頂部內容顯示,則返回2重新整理item中部內容 if (oldItem != newItem) { return 2 } //如果資料變更會影響item頂部內容顯示,則返回3重新整理item底部內容 if (oldItem != newItem) { return 3 } return super.getChangePayload(oldItem, newItem) }
接下來我們在onBindViewHolder
中處理就行 ,處理的方式和上面相同,這裡就再描述。
如果我們想要同時實現item中頂部和底部佈局內容的同時重新整理,那就可以向onBindViewHolder()
的payload中傳一個集合包含1和3標識或者其他特殊標識等等,方式不限,只要能讓onBindViewHolder()
知道要重新整理頂部和底部就即可。
本篇文章主要是講解了如何實現RecyclerView
中子item如何單獨重新整理以及子item的某一部分內容如何實現單獨重新整理,沒什麼難度,大家知道並學會運用即可,更多關於Android RecyclerView單獨重新整理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45