DataSetObserver简单使用

本文介绍了Android中的DataSetObserver,它是观察者模式的一种应用,常用于Adapter数据变化的监听。详细讲解了DataSetObserver的用途,如何创建并注册Observer,以及在数据变化后的处理方法onChanged。示例代码展示了在数据集添加元素时,如何通过Observer实现相应的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、DataSetObserver简介

        Observable是观察者模式的典型应用。在Android下,Observable是一个泛型的抽象类,表示一个观察者对象,提供了观察者注册、反注册及清空三个方法。Observable的直接继承者有两个:DataSetObservable和ContentObservable。ContentObservable实现比较复杂,不过功能与DataSetObservable类似,这里只讲解DataSetObservable。DataSetObservable在很多的Adapter中都用到,像BaseAdapter。DataSetObservable使用DataSetObserver实例化了Observable。DataSetObserver表示了一个数据集对象的观察者。

二、DataSetObserver使用方式

1)首先我们新建一个activity,内容是一个button,用于做添加数据的一个按钮,代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".activity.ObserverActivity">
    <Button
        android:id="@+id/btnAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加"/>
</LinearLayout>

2)第二步我们需要写一个DataSetObserver的子类,DataChageSetObserver,代码也很简单。

class DataChageSetObserver extends DataSetObserver{
                @Override
                public void onChanged() {
                        super.onChanged();
                        for (int i = 0; i <list.size() ; i++) {
                                Log.i("observer", "onChanged: "+list.get(i));
                        }
                }

                @Override
                public void onInvalidated() {
                        super.onInvalidated();
                }
        }

3)我们需要一个observer,并且需要让我们的数据集去注册一下我们的observer

list=new MyListArray<String>();
observer=new DataChageSetObserver();
list.registerDataSetObserver(observer);

这里MyListArray是ArrayList的子类,因为List没有register方法,我们直接抄写BaseAdapter的代码即可,代码如下

public class MyListArray<T> extends ArrayList<T> {
        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();
        }
}

完整代码

public class ObserverActivity extends AppCompatActivity {

        private Button btnAdd;
        private MyListArray<String> list;
        DataChageSetObserver observer;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_observer);
                list=new MyListArray<String>();
                observer=new DataChageSetObserver();
                list.registerDataSetObserver(observer);
                initView();
        }

        private void initView() {
                btnAdd = (Button) findViewById(R.id.btnAdd);
                btnAdd.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                                list.add("dafda");
                                list.notifyDataSetChanged();
                        }
                });
        }

        class DataChageSetObserver extends DataSetObserver{
                @Override
                public void onChanged() {
                        super.onChanged();
                        for (int i = 0; i <list.size() ; i++) {
                                Log.i("observer", "onChanged: "+list.get(i));
                        }
                }

                @Override
                public void onInvalidated() {
                        super.onInvalidated();
                }
        }


}

总结

observer主要的方法是注册(register)、数据变化(list.add)、变化后处理(onChanged),这里onChanged是要做增加数据之后该如何处理,BaseAdapter是重新加载可见的数据。我们这里就简单的打印一下log日志。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值