簡體   English   中英

NestedScrollView 內的 RecyclerView 問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM