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

产品要求:

      项目中同一个页面,有两个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值