浅析android 控件listView中的设计模式

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<String, ?>> 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 就非常简单了。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值