• 【转】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));

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

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

  • 相关阅读:
    【BZOJ4868】期末考试 [三分][贪心]
    【BZOJ4880】排名的战争 [暴力]
    【BZOJ1449&&2895】球队预算 [费用流]
    【BZOJ1221】【HNOI2001】软件开发 [费用流]
    【BZOJ4837】LRU算法 [模拟]
    Leetcode题解(30)
    Leetcode题解(29)
    Leetcode题解(28)
    Leetcode题解(27)
    Leetcode题解(26)
  • 原文地址:https://www.cnblogs.com/pili/p/6889240.html
Copyright © 2020-2023  润新知