zoukankan      html  css  js  c++  java
  • 【转】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));

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

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

  • 相关阅读:
    原生内存泄漏检测
    安卓适配
    游戏里的动态阴影-ShadowMap实现原理
    游戏里的跨地图寻路算法
    Unity-Shader-动态阴影(上) 投影的矩阵变换过程
    Unity-奥义技能背景变黑效果
    UGUI学习笔记
    Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里
    Unity-Shader-光照模型之漫反射
    Unity3D-Shader-热扭曲效果
  • 原文地址:https://www.cnblogs.com/pili/p/6889240.html
Copyright © 2011-2022 走看看