ListView与不同模板视图适配器Adapter兼容问题

来源:互联网 发布:mac air 电池循环次数 编辑:程序博客网 时间:2024/06/01 18:03

产品要求:

      项目中同一个页面,有两个TAB,数据样式相同,但是列表展示不同。并且根据用户角色的不同,展示的列表样式会有新的变化。


       另一个TAB的样式,与第一个TAB样式不相同。两者的数据Bean是相同的。



解决方法:

要实现这种效果,一种是使用同一个Adapter,根据不同的模板类型生成不同的子项视图;

另一种方式是根据模板样式,生成不同的Adapter。


方式一:使用同一个Adapter

优点:这种方式数据处理部分能够复用,根据不同的样式,对应生成视图,通过ViewHolder控制显隐。

缺点:这种模式扩展会比较麻烦,不同模板相互影响,改动一个模板可能影响其他模板,出现一些意外的错误。

随着业务的复杂ViewHolder会变得比较臃肿。


方式二:不同模板不同Adapter

优点:模板之间相互不影响,耦合度低,更有利于扩展和修改变更。

缺点:数据处理相同,所有Adapter会重复数据处理方法。


     相比之下,方式二是最好的方式,因为对程序员最有利的,因为产品很容易变更样式,修改是一种经常的反应。低耦合是最有利的方式设计。因此选择不同模板不同Adapter的方式。


优化一: 数据处理相同,那么可以复用。采用基类子类的方式,数据处理全部放在基类中处理,这样就不需要重复写数据处理的方法。

基类:

public abstract class HomeAdapter extends BaseAdapter {
/** TAB页面列表数据 */protected TabBean data = null;protected Context mContext;
    /** TAB页面列表数据 */
    protected TabBean data = null;
    protected Context mContext;
    /** 消息Handler */
    protected Handler handler;


    public HomeAdapter(Context context, Handler handler) {
        this.mContext = context;
        this.handler = handler;
    }


    public void setData(TabBean data) {
        this.data = data;
        notifyDataSetChanged();
    }


    @Override
    public int getCount() {
        return (null == data || null == data.getList()) ? 0 : data.getList().size();
    }


    @Override
    public Object getItem(int position) {
        if((null != data && null != data.getList())) {
            return data.getList().get(position);
        }
        return null;
    }


    @Override
    public long getItemId(int position) {
        return position;
    }

}


子类继承父类,实现视图生成方法。每个子类Adapter都可以自己维护自己的ViewHolder。

/**
     * 普通订单适配器
     */
    public static class HomeNormalAdapter extends HomeAdapter {
        static class ViewHolder {
            TextView userName;
            IconFontTextView orderStatusIcons;
            RelativeLayout userRoot;
            RelativeLayout callLayout;
            /** 普通订单房屋地址 */
            TextView content;
            TextView notaryStatus;
            TextView payStatus;
            /** 订单时间 */
            TextView time;
            IconFontTextView callIcons;
            /** 已下户图标 */
            IconFontTextView notaryText;
            /** 第二个按钮(抵押) */
            TextView pledgeText;
            /** 复制下户报告 */
            TextView clipboard;
            /** 当前项数据索引 */
            int position;
        }


        public HomeNormalAdapter(Context context, Handler handler) {
            super(context, handler);
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {

(省略)

            }
            return convertView;
        }
    }


/** * 微信模板适配器 */public static class HomeWxAdapter extends HomeAdapter {    static class ViewHolder {        /** 用户姓名 */        TextView userName;        /** 订单状态图标 */        IconFontTextView orderStatusIcons;        RelativeLayout userRoot;        RelativeLayout callLayout;        /**         * 订单时间         */        TextView time;        /**         * 拨打电话图标         */        IconFontTextView callIcons;        /**         * 已下户/公证图标         */        TextView notaryText;        /**         * 借款人姓名         */        TextView borrowerName;        /**         * 微信订单房屋地址         */        TextView wxHouseAddress;        /**         * 订单编号         */        TextView orderNO;        /**         * 订单复制按钮         */        TextView orderCliperBoard;        /** 按钮位置 */        int position;    }    public HomeWxAdapter(Context context, Handler handler) {        super(context, handler);    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder;        if (convertView == null) {
(省略)
        }        return convertView;    }}

这样,就解决了数据复用,视图各自维护的目的。


优化二:根据不同的模板生成不同的Adapter,提供外部统一使用,外部通过基类使用Adapter。

这可以采用构造器模式。

/** * 首页订单列表适配器构造器 * 说明: 根据模板类型生成对应的适配器。如果有新的模板可相应的进行扩展 */public static class Builder {    public static HomeAdapter build(String order_type, Context context, Handler handler) {        if (Utils.GetStringNoNil(order_type).equals(TAB_TYPE_WEIXIN)) {            //微信订单            return new HomeWxAdapter(context, handler);        }        return new HomeNormalAdapter(context, handler);    }}

至此,就完美解决了相同数据不同模板样式的Adapter适配问题。





1 0
原创粉丝点击