【转】BaseAdapter&DataSetObserver通知机制

一.BaseAdapter内部设有观察者机制

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
   
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer); //刷新界面和数据
    }

    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged(); //刷新界面
    }


    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }
/** *一下省略到一大片成员变量 *方法数(何止一二个) *变量(反正已知的不多) */ }

其中我们看到了

--观察者集合容器

DataSetObservable
public abstract class DataSetObserver {

    public void onChanged() {
        // Do nothing
    }

    public void onInvalidated() {
        // Do nothing
    }
}

二,应用

首先:这些观察者普遍存在于BaseAdapter,FragmentPagerAdapter,PagerAdapter,RecyclerView.Adapter中,主要是为了配合适配器更新数据

应用一.RecylerView中的EmptyView

public class RecyclerViewEmptySupport extends RecyclerView {
    private View emptyView;

    private AdapterDataObserver emptyObserver = new AdapterDataObserver() {


        @Override
        public void onChanged() {
            Adapter<?> adapter =  getAdapter();
            if(adapter != null && emptyView != null) {
                if(adapter.getItemCount() == 0) {
                    emptyView.setVisibility(View.VISIBLE);
                    RecyclerViewEmptySupport.this.setVisibility(View.GONE);
                }
                else {
                    emptyView.setVisibility(View.GONE);
                    RecyclerViewEmptySupport.this.setVisibility(View.VISIBLE);
                }
            }

        }
    };

    public RecyclerViewEmptySupport(Context context) {
        super(context);
    }

    public RecyclerViewEmptySupport(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public RecyclerViewEmptySupport(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setAdapter(Adapter adapter) {
        super.setAdapter(adapter);

        if(adapter != null) {
            adapter.registerAdapterDataObserver(emptyObserver);
        }

        emptyObserver.onChanged();
    }

    public void setEmptyView(View emptyView) {
        this.emptyView = emptyView;
    }}

xml

<com.maff.utils.RecyclerViewEmptySupport android:id="@+id/list1"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    />
  <
TextView android:id="@+id/list_empty"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="Empty" />

Activity

RecyclerViewEmptySupport list = 
    (RecyclerViewEmptySupport)rootView.findViewById(R.id.list1);
    list.setLayoutManager(new LinearLayoutManager(context));
    list.setEmptyView(rootView.findViewById(R.id.list_empty));

应用二,我们可以通过注册观察者,判断数据变化我们可以减少判断,特别在加载网络数据的时候

应用三,我们可以在数据变化时开始某一类动画

原文地址:https://www.cnblogs.com/pili/p/6889240.html