簡體   English   中英

如何在不調用 notifyItemChanged 或 DiffUtil 的情況下更新/刷新 RecyclerView 的特定項目?

[英]How to update/refresh a specific item of RecyclerView without calling notifiyItemChanged or DiffUtil?

我有一個嵌套的RecyclerViews ,這個 recyclerView 的每一行/項目也是一個 recyclerView,並且有一個外部事件將更新內部 recyclerView 中的一個項目。 我的外部 RecyclerView 適配器的 onBindViewHolder 看起來像這樣

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            GiftWrappingHorizontalViewHolder viewHolder = (GiftWrappingHorizontalViewHolder) holder;
            viewHolder.giftWrappingRecyclerView.setLayoutManager(new LinearLayoutManager(viewHolder.giftWrappingRecyclerView.getContext(),
                    RecyclerView.HORIZONTAL, false));
            viewHolder.topTextView.setText(dataList.get(position).getTopTextName());
            if(dataList.get(position).getType() == 1) {
                GiftWrappingHorizontalAdapter adapter = new GiftWrappingHorizontalAdapter(dataList.get(position)
                        .getItems(), position);
                viewHolder.giftWrappingRecyclerView.setAdapter(adapter);
                viewHolder.giftWrappingRecyclerView.setItemAnimator(null);
                adapter.setGiftWrappingHorizontalClickListener(giftWrappingHorizontalClickListener);
            } else if(dataList.get(position).getType() == 0){
                GiftWrappingAddOnsAdapter adapter = new GiftWrappingAddOnsAdapter(dataList.get(position)
                        .getItems(), position);
                viewHolder.giftWrappingRecyclerView.setAdapter(adapter);
                viewHolder.giftWrappingRecyclerView.setItemAnimator(null);
                adapter.setGiftWrappingAddOnEventsListener(giftWrappingAddOnEventsListener);
            }

    }

如您所見,我將內部 recyclerViews 綁定到 onBindViewHolder 內的適配器,我想更新內部 recyclerView 的特定項目而不調用 notifiyItemChanged,因為這將重新創建分頁的內部適配器,它將調用第一個頁面只是因為內部 RecyclerViews 正在使用 HORIZONTAL LinearLayoutManager。

是否有任何方法可以通過其 position 訪問 recyclerView 的項目並將 notifiyItemChanged 調用到內部 RecyclerView 來實現?

您可以嘗試使用notifyItemChanged()

notifyItemChanged(int position, Object payload)

通知任何已注冊的觀察者 position 中的項目已更改為可選有效負載 object。

邏輯

arrayList.set(updatePosition, yourValue);
adapterOBJ.notifyItemChanged(updatePosition);

實時數據

有趣的部分是您可以直接在布局中使用它

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable name="myTextLiveData" type="String" />
    </data>

    <TextView
    ...
      android:text="@{myTextLiveData}
    />

</layout>

在適配器 onBind() 中,您可以設置 object 的 livedata,無論您在哪里更新 livedata.setValue("new value"),它都會立即反映。

我嚴格假設您只更新數據部分。 如果您的數據要修改訂單或列表大小,那么最好堅持 notifyItemChanged()

你也可以考慮DiffUtil

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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