這幾天在學習DataBinding,ViewMode, MVVM, LiveData,,, 比照Sunflower項目, 重新了自己的項目.
我的項目截圖:
簡單來說是一個列表, 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方式開發的