[英]RecyclerView inside NestedScrollView issue
我有一個與recyclerView
相關的問題。 所以我在NestedScrollView
中使用它。 我知道這對性能不利,但目前我沒有其他解決方案。
我對列表進行了分頁,並將邏輯提供給了nestedScrollView
。 所以當它到達底部時,我加載下一個列表。 當需要更新我的列表時,我正在調用我的適配器notifyDataSetChanged
。
看看發生了什么。 我為每個分頁加載 30 個項目。 當我加載前 30 個項目時,我將它們提供給我的適配器,它會同時綁定所有這些項目。 沒關系,因為它在nestedScrollView
中。 當我滾動到底部並加載接下來的 30 個項目時,我正在為我的適配器調用notifyDataSetChanged
來更新 UI。 但這次不是綁定接下來的 30 個項目,而是一次綁定所有 60 個項目。 而且每次我加載越來越多的項目時,情況會變得更糟,因為它綁定了適配器中的所有項目。 有沒有辦法防止這種情況並只綁定新添加的項目?
抱歉,我無法上傳代碼部分。 沒什么特別的,它是nestedScrollView
內的一個簡單的recyclerview
。
分頁工作正常,它應該在滾動上加載越來越多。 如果你只想要最新的,那么你可以在 api function 上做一件事,重新初始化你的 arraylist,這樣它只會綁定最新的 30。
一個可能的解決方案可能是使用DiffUtil 。 一旦你實現了你的 DiffCallback 你就可以這樣使用它(取自文檔)
List oldList = mAdapter.getData();
DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldList, newList));
mAdapter.setData(newList);
result.dispatchUpdatesTo(mAdapter);
我實際上並沒有嘗試過,但這樣只能綁定更新的項目。
您實際遇到的問題是,由於您的 RecyclerView 位於 ScrollView 內,因此實際上永遠不會回收視圖,並且一旦您調用 notifyDataSetChanged,就會觸發對所有項目的綁定。
編輯 - 使用 ListAdapter
我最近有一個類似的問題要解決,我最終做的是使用ListAdapter來簡化 DiffUtils 的使用。
class ItemsAdapter() :
ListAdapter<Item, ItemViewHolder>(ItemComparator()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
ItemViewHolder(parent)
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
holder.bind(getItem(position))
}
}
class ItemComparator : DiffUtil.ItemCallback<Item>() {
override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Item, newItem: Item): Item {
return oldItem.prop1 == newItem.prop1 &&
oldItem.prop2 == newItem.prop2 &&
oldItem.prop3 == newItem.prop3
}
}
在您的 Activity/Fragment 中,當您獲得新頁面時只需調用adapter.submitList(items)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.