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适配问题。
- ListView与不同模板视图适配器Adapter兼容问题
- Android适配器视图与适配器AdapterView & Adapter
- ListView适配器Adapter介绍与优化
- ListView适配器Adapter介绍与优化
- ListView 适配器(Adapter)
- ListView和Adapter(适配器)
- listview adapter 常用适配器
- Adapter适配器和ListView
- Android listview与adapter用法(包括自定义需要的适配器)
- Android UI设计:ListView 控件与 Adapter 适配器
- ListView 适配器(Adapter)优化
- ListView,GridView 和 适配器 Adapter
- ListView的自定义适配器Adapter
- Android listview入门(listview适配器Adapter)
- Android listview加载不同布局与adapter用法
- Android控件之列表视图ListView与适配器用法
- Android控件之列表视图ListView与适配器用法
- Android控件之列表视图ListView与适配器用法
- c++第四次作业
- Android Action Bar学习(一)--基本介绍及使用
- Netty 4.x 实战详解
- java的几个小知识
- JavaScript学习记录day2-数据类型、变量
- ListView与不同模板视图适配器Adapter兼容问题
- Windows环境下Composer的安装教程
- iOS应用架构谈 组件化方案
- 资料链接
- BZOJ 1293: [SCOI2009]生日礼物 链表模拟
- Android通知栏消息(基本文字通知)
- 在Java Web项目中引入Mondrian多维分析框架
- docker配置文件
- cc2541 gpio通用gpio和adc的使用