欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?RecyclerView使用ListAdapter高效刷新數(shù)據(jù)的操作方法

 更新時(shí)間:2022年10月24日 09:07:18   作者:Stars-one  
這篇文章主要介紹了Android?RecyclerView使用ListAdapter高效刷新數(shù)據(jù),本次也是介紹了用另外一種方法來實(shí)現(xiàn)RecyclerView高效刷新數(shù)據(jù)的功能,需要的朋友可以參考下

我們都知道,當(dāng)RecyclerView數(shù)據(jù)源更新后,還需要通過adapter調(diào)用對應(yīng)的方法,從而讓RecyclerView重新繪制頁面

本次也是介紹了用另外一種方法來實(shí)現(xiàn)RecyclerView高效刷新數(shù)據(jù)的功能

問題

首先,默認(rèn)各位是有使用RecyclerView的經(jīng)驗(yàn)的,

對于數(shù)據(jù)的更新,我們一般可以使用adapter的下面四個(gè)方法:

  • notifyDataSetChanged() 整個(gè)數(shù)據(jù)改變
  • notifyItemInserted() 往某個(gè)下標(biāo)插入數(shù)據(jù),并觸發(fā)動(dòng)畫
  • notifyItemChanged() 更新某個(gè)下標(biāo)的數(shù)據(jù),并觸發(fā)動(dòng)畫
  • notifyItemRangeRemoved() 移除某個(gè)下標(biāo)的數(shù)據(jù),并觸發(fā)動(dòng)畫

但是,其中下面的三個(gè)方法傳參需要給個(gè)position下標(biāo),這個(gè)有時(shí)候每次由我們?nèi)ビ?jì)算獲取,很麻煩,而且我們還要處理對應(yīng)的增刪改的邏輯

所以之后Android官方也是出了一個(gè)新的工具DiffUtils

DiffUtils使用

DiffUtil主要提供了一個(gè)靜態(tài)方法供我們調(diào)用calculateDiff(),其中的參數(shù)為一個(gè)Callback靜態(tài)抽象類,我們需要先寫一個(gè)類,繼承并實(shí)現(xiàn)其中的方法

class DiffCallBack(val oldList: ArrayList<Person>, val newList: ArrayList<Person>) :DiffUtil.Callback() {

    //判斷兩個(gè)對象是否相同
    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        
        return oldList[oldItemPosition].id == newList[newItemPosition].id
    }

    override fun getOldListSize(): Int {
        return oldList.size
    }

    override fun getNewListSize(): Int {
        return newList.size
    }

    //判斷兩個(gè)對象內(nèi)容是否相同
    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        val newItem = newList[newItemPosition]
        val oldItem = oldList[oldItemPosition]

        //如果新數(shù)據(jù)和舊數(shù)據(jù)的名稱和年齡相同,則視為兩個(gè)item的內(nèi)容相同
        return oldItem.age == newItem.age && oldItem.name == newItem.name
    }

}

實(shí)際上,此類就是用來比較兩個(gè)List的不同之處,定義區(qū)分兩個(gè)同類的對象,是否相同,從上面的兩個(gè)方法也是能夠看得出來

首先,areItemsTheSame()方法先判斷兩個(gè)item是否為同個(gè)對象

這里我是選用了id作為唯一標(biāo)識來區(qū)分是否為同一對象,當(dāng)然,也可以用內(nèi)存地址來比對,如果是內(nèi)存地址來比對,則涉及淺拷貝和深拷貝的問題,這里不擴(kuò)展講解了

其次,再通過areContentsTheSame()方法來判斷兩個(gè)item內(nèi)容是否相同

現(xiàn)在,我們有了一個(gè)Callback類,可以使用calculateDiff()方法了:

val oldList = adapter.getData()
//深拷貝oldList得到newList,然后對newList按照業(yè)務(wù)進(jìn)行增刪改的操作,這里代碼就省略了..

//計(jì)算不同之處
val diffResult = DiffUtil.calculateDiff(DiffCallBack(oldList,newList))
//adapter設(shè)置新數(shù)據(jù)
adapter.setData(newList)
//將變更操作分發(fā)給adapter
diffResult.dispatchUpdatesTo(adapter)

上面給的代碼可能不是太全,因?yàn)檫@種方法不是我們推薦的寫法,更推薦使用ListAdapter來實(shí)現(xiàn)此功能,具體可看下文

實(shí)際上,DiffUtil算法還是耗時(shí)間的,如果數(shù)據(jù)更多,估計(jì)時(shí)間也會隨之增多,所以,官方推薦開啟個(gè)異步線程來處理計(jì)算,之后分發(fā)操作再切換UI線程進(jìn)行數(shù)據(jù)的更新操作

ListAdapter使用

ListAdapter其實(shí)就是對上面的DiffUtil的一個(gè)封裝類,以往,我們的Adapter都是繼承了RecyclerView.Adapter,并在其中寫了個(gè)List去裝載數(shù)據(jù),十分麻煩

ListAdapter里面維護(hù)著線程池并且還會為我們將視圖修改操作移到主線程,這樣我們就可以很方便的使用DiffUtil了

如果我們將此Adapter替換成繼承與ListAdapter,那么都不需要我們在類中寫上個(gè)List,代碼示例如下:

class RvAdapter() : ListAdapter<Person, RvAdapter.ViewHolder>(diffCallback) {

    companion object {
        val diffCallback = object : DiffUtil.ItemCallback<Person>() {
            override fun areItemsTheSame(oldItem: Person, newItem: Person): Boolean {
                return oldItem.id == newItem.id
            }

            override fun areContentsTheSame(oldItem: Person, newItem: Person): Boolean {
                //如果新數(shù)據(jù)和舊數(shù)據(jù)的名稱和年齡相同,則視為兩個(gè)item的內(nèi)容相同
                return oldItem.age == newItem.age && oldItem.name == newItem.name
            }

        }
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var tvAge: TextView = itemView.findViewById(R.id.tvAge)
        var tvName: TextView = itemView.findViewById(R.id.tvUserName)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val itemView = View.inflate(parent.context, R.layout.rv_item_person, null)
        return ViewHolder(itemView)
    }


    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = getItem(position)
        holder.tvName.text = item.name
        holder.tvAge.text = item.age.toString()
    }
}

ListAdapter<T,ViewHolder>第一個(gè)泛型即為你的數(shù)據(jù)實(shí)體類,第二個(gè)參數(shù)為ViewHolder類

注意: 之后的數(shù)據(jù)增刪改查都需要調(diào)用adapter提供的submitList()方法即可

val oldList = adapter.currentList

val newList = oldList.map { it }.toMutableList()
newList.removeAt(10)
//下標(biāo)2加個(gè)新數(shù)據(jù)
newList.add(2, Person(90, "我的", 72))
adapter.submitList(list)

效果:

參考文獻(xiàn)

到此這篇關(guān)于Android RecyclerView使用ListAdapter高效刷新數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Android RecyclerView刷新數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android打開系統(tǒng)相機(jī)并拍照的2種顯示方法

    Android打開系統(tǒng)相機(jī)并拍照的2種顯示方法

    這篇文章主要介紹了Android打開系統(tǒng)相機(jī)并拍照的2種顯示方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android Material加載進(jìn)度條制作代碼

    Android Material加載進(jìn)度條制作代碼

    這篇文章主要為大家詳細(xì)介紹了AndroidMaterial加載進(jìn)度條的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android截取視頻幀并轉(zhuǎn)化為Bitmap示例

    Android截取視頻幀并轉(zhuǎn)化為Bitmap示例

    利用MediaMetadataRetriever按照時(shí)間截取視頻并轉(zhuǎn)換為Bitmap存放于SDCard,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android setTag方法的key問題解決辦法

    Android setTag方法的key問題解決辦法

    這篇文章主要介紹了Android setTag方法的key問題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android手冊之Toolbar搜索聯(lián)動(dòng)及監(jiān)聽小技巧

    Android手冊之Toolbar搜索聯(lián)動(dòng)及監(jiān)聽小技巧

    這篇文章主要為大家介紹了Android手冊之Toolbar搜索聯(lián)動(dòng)及監(jiān)聽小技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 淺談android組件化之ARouter簡單使用

    淺談android組件化之ARouter簡單使用

    本篇文章主要介紹了淺談android組件化之ARouter簡單使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 詳解Android單元測試方法與步驟

    詳解Android單元測試方法與步驟

    這篇文章給大家分享了Android單元測試方法與步驟的相關(guān)知識點(diǎn),有興趣和需要的朋友參考學(xué)習(xí)下。
    2018-07-07
  • Android入門教程之Picasso框架

    Android入門教程之Picasso框架

    本文會先介紹Picasso的基本使用方法,讓您快速上手Picasso。后面我們分享實(shí)現(xiàn)ListView顯示網(wǎng)絡(luò)圖片的實(shí)例,從源碼角度詳細(xì)分析它的實(shí)現(xiàn),有需要的可以參考借鑒。
    2016-08-08
  • android app跳轉(zhuǎn)到微信的示例

    android app跳轉(zhuǎn)到微信的示例

    這篇文章主要介紹了android app跳轉(zhuǎn)到微信的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • ViewPager+RadioGroup仿微信主界面

    ViewPager+RadioGroup仿微信主界面

    這篇文章主要為大家詳細(xì)介紹了ViewPager+RadioGroup仿微信主界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論