几种适配器&观察者&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更新,其实现源代码如下图。

 

技术分享

 

完成整个数据更新过程如下:

  1. UI(ListView)在给自己设置数据源时(setAdapte())时,同时向Adapter的mDataSetObservable成员中注册了一个观察者回调监听器,该监听器负责用变化后的数据刷新UI。
  2. 当数据源发生变化时,先调用adapter的notifyDataSetChanged()方法,这时adapter负责将自己注册的所有观察者都通知一遍,告诉它们数据发生变化了。
  3. 因为第一步已经注册了观察者,自然UI就得到了更新。

 

以上是关于几种适配器&观察者&ListView之间的那点事的主要内容,如果未能解决你的问题,请参考以下文章

javascript设计模式

LiveData 分页列表大小始终为 0

Java常见的几种设计模式

KVO && KVC

设计模式解密(23) - 总结篇

java中常用的设计模式都有哪些?