![](/img/trans.png)
[英]Update RecyclerView adapter item without calling OnCreateViewHolder
[英]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.