几种适配器&观察者&ListView之间的那点事
Posted 寸草之心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几种适配器&观察者&ListView之间的那点事相关的知识,希望对你有一定的参考价值。
android中的几种适配器&观察者&ListView
1.我们知道Android中的Adapter类是处于ListView和数据源之间的数据总线,它负责为ListView提供数据。
2.适配器(BaseAdapter)中提供了一个notifyDataSetChanged()方法,当数据源中的数据发生变化时,可以通过调用该方法去通知ListView更新界面上的数据。
3.常见的三种adapter它们可以显示的数据的区别在哪里:
- ArrayAdapter,数据源中只能是文本数据,只要传入的显示每行的布局View是TextView类型或者包含TextView控件即可。
- SimpleAdapter,数据源中可以有图片或文本,显示控件集合和图片、文本数据集合可以通过两个数组对应传入。
- CursorAdapter,为访问数据库而定义。
从上面的类图,可以看到:
- 抽象类BaseAdapter更灵活,如果自定义自己的Adapter集成它更合理。
- Adapter的地位就像观察者模式中的Subject。
- 在给UI指定Adapter时,必须要给Adapter注册一个观察者,这样当调用者调用adapter的notifyDataSetChanged()方法时,才可以更新自己UI,所以顶用者必须自定义
DataSetObserver对象,用以处理数据变化时的UI更新。
- mDataSetObservable是一个聚合对象,也就是说它里面可以放多个观察者,所以调用者可以在同一个adapter中注册多个
DataSetObserver 对象,这样当数据发生变化时,可以有多个不同的处理逻辑。
上图为ListView的setAdapter()方法中的片段,可以看到,在给ListView设置adapter数据源时,同时给adapter数据源注册了一个观察者。
而这个观察者回调中的处理方法正是用以处理ListView的UI更新,其实现源代码如下图。
完成整个数据更新过程如下:
- UI(ListView)在给自己设置数据源时(setAdapte())时,同时向Adapter的mDataSetObservable成员中注册了一个观察者回调监听器,该监听器负责用变化后的数据刷新UI。
- 当数据源发生变化时,先调用adapter的notifyDataSetChanged()方法,这时adapter负责将自己注册的所有观察者都通知一遍,告诉它们数据发生变化了。
- 因为第一步已经注册了观察者,自然UI就得到了更新。
以上是关于几种适配器&观察者&ListView之间的那点事的主要内容,如果未能解决你的问题,请参考以下文章