listview中涉及两种设计模式:adapte模式和observer模式。

如下是两种模式的UML类图:

                  




先来分析adapter模式:

listview冲的那个client角色,接口Adapter充当target,BaseAdapter充当adapter,而listview的数据对象就是adaptee。

Adapter接口抽象出listview需要的接口getItem,getCount,getView。

BaseAdapter子类中实现的Adapter接口,其实是对数据对象的操作,也就是对adaptee依赖关系。

以SimpleAdapter类为例分析:

public class SimpleAdapter extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {private List<? extends Map> mData;    public int getCount() {        return mData.size();    }    /**     * @see android.widget.Adapter#getItem(int)     */    public Object getItem(int position) {        return mData.get(position);    }    /**     * @see android.widget.Adapter#getItemId(int)     */    public long getItemId(int position) {        return position;    }    /**     * @see android.widget.Adapter#getView(int, View, ViewGroup)     */    public View getView(int position, View convertView, ViewGroup parent) {        return createViewFromResource(mInflater, position, convertView, parent, mResource);    }    private View createViewFromResource(LayoutInflater inflater, int position, View convertView,            ViewGroup parent, int resource) {        View v;        if (convertView == null) {            v = inflater.inflate(resource, parent, false);        } else {            v = convertView;        }        bindView(position, v);        return v;    }}

成员变量mData是uml类图中的adaptee,listview对数据对象的访问抽象出的接口在Adapter、接口中。
public interface Adapter {         int getCount();             Object getItem(int position);       long getItemId(int position);        View getView(int position, View convertView, ViewGroup parent);          int getItemViewType(int position);           int getViewTypeCount();            }

listview对data的使用抽象成几个接口函数,这是关键的一步。通过抽象出的接口,实现了listview不需要关心data的类型,就可以用统一的方式得到需要的数据。对于不同的data类型,我们只需要根据具体的data类型,实现对应的adapter即可。

如果不使用adapter模式,data数据和对data数据的访问都要移到listview中的话,会使得listview代码非常复杂。而且针对不同的data,用户还要修改listview,这是开发中非常terrible的事情。而且data相关的操作不属于listview的功能范畴,也应该移到listview类外面完成,应该让listview尽可能的功能单一。通过对Adapter接口的抽象,不同的data类型,用户只需要是相对应的接口即可,这样使用listview 就非常简单了。



更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Flutter基础(十三)Flutter与Android的相互通信
  4. Android开发艺术探索笔记之Activity
  5. 序列化
  6. AndroidStudioTip--用Builder模式替代构造方法
  7. 关于greenDAO,看这篇文章就够了
  8. Android(安卓)使用SQLiteDatabase操作SQLite数据库
  9. Android(安卓)MVP模式 谷歌官方代码解读

随机推荐

  1. android HAL介绍
  2. Android(安卓)创建与解析XML(二)—— Dom方
  3. Android:Android学习路线图
  4. Android 各种实现Tab效果的实现方式
  5. Android系统移植与调试之------->如何修
  6. Android ART 垃圾回收机制
  7. Android 开发笔记 —— AndroidStudio 中
  8. android的一些开源项目
  9. Android(安卓)开发绕不过的坑:你的 Bitmap
  10. Android(安卓)实现微信聊天一样的布局