RecycleView刷新原理——notifyDataSetChanged()

之前有个朋友问我,为啥调用了Adapter.notifyDataSetChanged(),RecycleView并没有刷新界面。当时我也没有太留意这个问题,我随手在网上搜索了一下。大部分都说的不是很清楚,所以我决定自己看看源码:

 public final void notifyDataSetChanged() {
        this.mObservable.notifyChanged();
        }

我们知道adapter调用的notifyDataSetChanged()采用的是观察者模式,然后再看看this.mObservable是个什么东西,

public abstract static class Adapter {
        private final RecyclerView.AdapterDataObservable mObservable = new RecyclerView.AdapterDataObservable();
      ...
}

最后发现我们观察的对象是adapterData。现在我们就明白了其实调用adapter.notifyDataSetChanged()就是观察adapter数据源是否发生改变。那么adapter的数据源在哪里?我继承RecyclerView.adapter时会有一个需要我们实现的方法:

 @Override
    public int getItemCount() {
        return 0;
    }

当这个数据发生改变时,才会重新刷新界面,调用onBindViewHolder()方发。下面我用一个例子测试一下:

public class MyAdapter extends RecyclerView.Adapter {


    Context context;
    List datas;
    int len = 0; 

    public MyAdapter(Context context,List datas){
        this.context = context;
        this.datas = datas;
    }
    public void setLen(int len){
        this.len = len;
    }
    
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int type) {
        View view = View.inflate(context,R.layout.main_recycle_item,null);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        viewHolder.textView.setText(datas.get(i));
    }

    @Override
    public int getItemCount() {
        return datas.size()+len;
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        private TextView textView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            textView=item.findViewById(R.id.tv_item);
        }

    }



}

我在这个adapter中的getItemCount()方法返回添加了一个len的字段,当你调用了setLen(int len)方法时再调用adapter.notifyDataSetChanged()时,mdata并没有发生改变,但你会发现recycleView刷新了,添加默认的item了。

所以以后没有刷新的问题建议先看下getItemCount()数据时否发生改变。

你可能感兴趣的:(Android随笔)