【问题标题】:How to update/refresh a specific item of RecyclerView without calling notifiyItemChanged or DiffUtil?如何在不调用 notifyItemChanged 或 DiffUtil 的情况下更新/刷新 RecyclerView 的特定项目?
【发布时间】:2020-04-21 15:01:46
【问题描述】:

我有一个嵌套的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 内的适配器 我想在不调用 notifyItemChanged 的​​情况下更新内部 recyclerView 的特定项目,因为这将重新创建分页的内部适配器,并且它只会调用第一页,因为内部 RecyclerViews 正在使用 HORIZONTAL LinearLayoutManager 。

有没有办法通过按位置访问recyclerView 的项目并将notifiyItemChanged 调用到内部RecyclerView 来实现?

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    你可以试试notifyItemChanged()

    notifyItemChanged(int position, Object payload)
    

    通知任何已注册的观察者该位置的项目已更改 带有可选的有效负载对象。

    逻辑

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

    【讨论】:

    • 但这会调用 onBindViewHolder 并重新创建适配器对象,并且只会调用内部 API 的第一页...如果更新是第三页中的项目怎么办?
    • 你的意思是把它和有效载荷一起使用就可以了……有没有关于使用 notifyItemChanged 和有效载荷的完整例子?
    • @AbdulmalekDery 是的。阅读medium.com/@MiguelSesma/…
    【解决方案2】:

    LiveData

    有趣的是你可以直接在布局中使用它

    <?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() 中,您可以设置对象的 livedata,无论您在哪里更新 livedata.setValue("new value"),它都会立即反映。

    我严格假设您只更新数据部分。如果您的数据要修改订单或列表大小,那么最好坚持 notifyItemChanged()

    你也可以考虑DiffUtil

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2017-01-13
      • 2022-01-21
      相关资源
      最近更新 更多