在第一个视图类型上收到的 DiffUtil 有效负载数据,但我需要第二个视图类型



我在 DiffUtil 的 RecyclerView Adapter Custom Class 中使用了两个 viewType。

在我更新数据中,它将更新Diffutil getChangePayload,但它会更新第一个视图类型。

如何将有效负载数据更改为TYPE_ITEM视图类型?

> **CustomViewAdapter class**
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.home_list_items, parent, false);
return new MyViewHolder(itemView);
} else if (viewType == TYPE_HEADER) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.home_banner, parent, false);
return new HeaderView(itemView);
}
return null;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position, @NonNull List<Object> payloads) { 
Log.d(TAG, "onBindViewHolder: viewholder " + viewHolder);
Log.d(TAG, "onBindViewHolder: payload " + payloads);
}

对于您的具体情况,您下面列出了 2 种类型的项目(不混合(,我建议使用 RecyclerView 软件包中的ConcatAdapter

https://developer.android.com/reference/androidx/recyclerview/widget/ConcatAdapter

它允许您连接 2 个普通的 ViewAdapter - 每种类型一个单独的适配器。这使您的代码库更加干净和可维护。

这是一个如何使用它的简短示例:

MyAdapter adapter1 = ...;
AnotherAdapter adapter2 = ...;
ConcatAdapter concatenated = new ConcatAdapter(adapter1, adapter2);
recyclerView.setAdapter(concatenated);
class CustomDiffUtil<T> extends DiffUtil.Callback{
List<T> oldData;
List<T> newData;
public CustomDiffUtil(List<T> oldData,List<T> newData) {
this.newData = newData;
this.oldData = oldData;
}
@Override
public int getOldListSize() {
return oldData.size();
}
@Override
public int getNewListSize() {
return newData.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldData.get(oldItemPosition) == newData.get(newItemPosition);
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldData.get(oldItemPosition).equals(newData.get(newItemPosition));
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
//you can return particular field for changed item.
return super.getChangePayload(oldItemPosition, newItemPosition);
}

}

最新更新