1. RecyclerView自带的局部刷新
缺点:要知道数据变化index
//RecyclerView.Adapter中局部刷新主要API
Adapter.notifyItemChanged(int)
Adapter.notifyItemInserted(int)
Adapter.notifyItemRangeChanged(int,int)
Adapter.notifyItemRangeInserted(int,int)
Adapter.notifyItemRangeRemoved(int,int)
2. 使用DiffUtil, 只更新数据有变化的item, 25.1.0版本开始支持
缺点:数据比较在主线程,可能ANR
DiffUtil.DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldList, mTextModels), true);
myAdapter.setData(mTextModels);
result.dispatchUpdatesTo(myAdapter);
3. AsyncListDiffer,数据比较在子线程,27.1.0版本开始支持
在Adapter中获取数据不直接从model中获取,而改为从AsyncListDiffer中获取。实质仍然是对DiffUtil的包装。
public class MyDiffAdapter extends RecyclerView.Adapter {
private Context mContext;
private AsyncListDiffer<TextModel> mTextDiffl;
private DiffUtil.ItemCallback<TextModel> diffCallback = new MyItemCallBack();
public MyDiffAdapter(Context mContext) {
this.mContext = mContext;
mTextDiffl = new AsyncListDiffer<>(this, diffCallback);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_view, null);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
MyAdapter.MyViewHolder myViewHolder = (MyAdapter.MyViewHolder) holder;
TextModel textModel = getItem(position);
myViewHolder.tv.setText(textModel.getTextTitle() + "." + textModel.getTextContent());
}
@Override
public int getItemCount() {
return mTextDiffl.getCurrentList().size();
}
public void submitList(List<TextModel> data) {
mTextDiffl.submitList(data);
}
public TextModel getItem(int position) {
return mTextDiffl.getCurrentList().get(position);
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
MyViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.item_tv);
}
}
}
public class MyItemCallBack extends DiffUtil.ItemCallback<TextModel> {
@Override
public boolean areItemsTheSame(@NonNull TextModel oldItem, @NonNull TextModel newItem) {
return TextUtils.equals(oldItem.getTextTitle(), newItem.getTextTitle());
}
@Override
public boolean areContentsTheSame(@NonNull TextModel oldItem, @NonNull TextModel newItem) {
return TextUtils.equals(oldItem.getTextContent(), newItem.getTextContent());
}