在ListAdapter构造函数中调用submitList方法可能会导致数据更新问题,可以通过以下两种解决方法避免这个问题:
public class MyAdapter extends ListAdapter- {
private List
- data = new ArrayList<>();
public MyAdapter() {
super(DIFF_CALLBACK);
}
public void setList(List
- newList) {
data = newList;
submitList(newList);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// create and return a new view holder
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
// bind data to the view holder
}
@Override
public int getItemCount() {
return data.size();
}
private static final DiffUtil.ItemCallback
- DIFF_CALLBACK = new DiffUtil.ItemCallback
- () {
@Override
public boolean areItemsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
// return true if the items have the same id
}
@Override
public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
// return true if the items have the same content
}
};
}
在调用setList方法时,首先更新数据源data,然后再调用submitList方法,确保数据更新正确。
public class MyAdapter extends ListAdapter- {
public MyAdapter() {
super(DIFF_CALLBACK);
submitList(new ArrayList<>());
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// create and return a new view holder
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
// bind data to the view holder
}
@Override
public int getItemCount() {
return getCurrentList().size();
}
private static final DiffUtil.ItemCallback
- DIFF_CALLBACK = new DiffUtil.ItemCallback
- () {
@Override
public boolean areItemsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
// return true if the items have the same id
}
@Override
public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
// return true if the items have the same content
}
};
}
在构造函数中使用空列表初始化ListAdapter,然后在适当的时候调用submitList方法更新数据。这样可以避免在构造函数中调用submitList方法导致的数据更新问题。