submitList調用不能更新數據問題

這幾天在學習DataBinding,ViewMode, MVVM, LiveData,,, 比照Sunflower項目, 重新了自己的項目.
我的項目截圖:


image.png

image.png

簡單來說是一個列表, recycleView實現的, 當滑到底部后加載更多數據, 拼接在最后.

用了ViewModel加載更多數據, 這也是MVVM中要求的. 類名: FollowTopicListViewModel
實際的列表數據是保存在在ViewModel中的LiveData變量中的
val topicList = MutableLiveData<List<Express>>()

但是當加載更多數據并設置到topicList 后, 頁面上的RecyclerView并沒有顯示出新加載的數據.
具體的使用代碼:

viewModel.topicList.observe(this, Observer { topics ->
....
            adapter.submitList(topics)
....
        })

這里想說的是submitList不能刷新數據的問題, 所以這里省略了一些其他代碼. 基本來說就是這么使用的, 當viewModel中的LiveData變量topicList發生變化時, 會觸發 adapter.submitList(topics)

按照它的示例, 以為這么做沒問題, 但是誰知道就是不刷新, 當然我也可以在submitList之后調用adapter.notifyDataSetChanged()手工更新數據. 但是谷歌既然提供submitList必然不會是想讓你手工notify的.

費解啊! 無奈啊! 折騰了半天, 才弄明白, 原來這里的參數topics的賦值有要求:
ListAdapter.java: submitList() --> AsyncListDiffer.java :submitList()

 public void submitList(@Nullable final List<T> newList) {
        if (newList == mList) {
            // nothing to do
            return;
        }
......

如果傳入的列表跟之前的列表是同一個對象, 那么就什么都不會更新, 直接返回了. (WTF!!)
所以解決辦法就是在加載更多數據之后, 新生成一個新的全量list, 賦值給topicList

                       ......
                        var newList:MutableList<Express> = mutableListOf()
                        newList.addAll(expressList)
                        topicList.postValue(newList)
                        .....

這么做就OK了, 但是感覺效率很低啊, stackoverflow上還有人說可以這么做:

 topicList.postValue(null)
 topicList.postValue(newList)

就是先設置一個null值, 再設置你想要設置的列表值, 這也能解決, 但是這感覺更扯淡

誰有更好的辦法?
麻煩告訴我, 謝謝!

最終的代碼在:

https://github.com/shaopx/LiteDig -- 首頁-> 關注 這個列表是使用的mvvm方式開發的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容