在使用RecyclerView 的过程中,可以调用Adapter以下方法,实现视图刷新:

  • notifyItemChanged(int position, @Nullable Object payload)   
    对指定位置的item重新布局显示
    payload:可选参数,使用null时等同notifyItemChanged(int position)
     
  • notifyItemChanged(int position)    
    对指定位置的item重新布局显示
     
  • notifyDataSetChanged()  
    所有视图重新布局,重新显示

下面主要介绍前两个方法的区别。

payload参数作用

我们知道:一个item往往由许多控件组成,如Button、CheckBox、TextView、ImageView、EditText等组合。当我们点击item的某个控件时,RecyclerView需要重新计算布局、刷新视图来响应交互。假设一个item包含了N多个控件,如果调用notifyItemChanged(int position) 时,item中的每个控件都需要重新布局显示,无形中加大了内存和性能的损耗
最常见的坑就是点击item的一个button,却引起同item的ImageView图片闪烁了一下。payload参数就是用于解决上述问题。

 

实现过程

1、点击事件调用:notifyItemChanged(int position, @Nullable Object payload)   

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View view) {        adapter.notifyItemChanged(2, "aaaaa");    }});2、系统自动回调Adapter.onBindViewHolder(holder, position, List payloads)方法:public class TestAdapter extends RecyclerView.Adapter {    @Override // 方法1    public void onBindViewHolder(@NonNull PayloadVHolder holder, int position, @NonNull List payloads) {        if (payloads.isEmpty()) {            onBindViewHolder(holder, position);        } else {            String payload = payloads.get(0).toString();            if ("aaaaa".equals(payload)) {                holder.textView.setText("局部刷新结果:点击了位置-->" + position);            } else if ("bbbbb".equals(payload)) {                // 显示1秒后,取消高亮字体……            } else {            }        }    }    @Override // 方法2    public void onBindViewHolder(@NonNull PayloadVHolder holder, int position) {        holder.textView.setText("初始化内容:" + datas.get(position));        holder.imageView.setImageResource(R.mipmap.ic_launcher);        holder.button.setText("点击我试试);    }   

其中: