最近做项目有个需求,在两个页面都需要显示同一种数据的列表,但是页面布局不一样。
为了代码重复利用,想到以下两种方案在同一个adapter中实现不同布局的显示。
方案一:通过在adapter中设置不同类型区分。该方法扩展性更高,能够支持完全不一样的布局item显示。对于两种列表布局差异极大,显示内容也不一致时,需要使用该方案。
public class MyAdapter extends ArrayAdapter<Model> {
public static final int TYPE_1= 0;
public static final int TYPE_2 = 1;
private LayoutInflater mLayoutInflater;
private int type = TYPE_1;
public void setType(int type) {
this.type = type;
}
// 上下文
private Context mContext;
public MyAdapter (Context context, int resource,
List<Model> objects) {
super(context, resource, objects);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return type;
}
/*
* (non-Javadoc)
*
* @see android.widget.ArrayAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
@SuppressLint({ "CutPasteId", "InflateParams" })
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int curPos = position;
ViewHolder viewHolder = null;
ViewHolder2 viewHolder2 = null;
int itemtype = getItemViewType(position);
switch (itemtype) {
case TYPE_2 : {
if (convertView == null) {
viewHolder2 = new ViewHolder2();
convertView = mLayoutInflater.inflate(
R.layout..layout_1, null);
// 这里获取控件id
convertView.setTag(viewHolder2);
} else {
viewHolder2 = (ViewHolder2) convertView.getTag();
}
// 控件的显示代码实现
}
break;
default: {
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mLayoutInflater.inflate(
R.layout.layout_2, null);
// 这里获取控件id
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 控件的显示代码实现
}
break;
}
return convertView;
}
class ViewHolder {
// 布局1的控件定义
}
class ViewHolder2 {
// 布局2的控件定义
}
}
在使用MyAdapter的地方区分显示
MyAdatper adapter = new MyAdapter(参数);
adapter.setType(1);
// or adater.setType(2);
方案二:此方案layou1和layou2可以设置不同的显示,但是要求两个布局文件中的资源id必须完全一致。局限性较大。但如果两种列表显示的控件个数和内容都一致的用此方法更为简单。
public class MyAdapter2 extends ArrayAdapter<Model> {
private LayoutInflater mLayoutInflater;
// 上下文
private Context mContext;
private int tes
public MyAdapter (Context context, int resource,
List<Model> objects) {
super(context, resource, objects);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
/*
* (non-Javadoc)
*
* @see android.widget.ArrayAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
@SuppressLint({ "CutPasteId", "InflateParams" })
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mLayoutInflater.inflate(
res, null);
// 这里获取控件id
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 控件的显示代码实现
}
return convertView;
}
class ViewHolder {
// 布局的控件定义
}
}
在代码中调用
MyAdapter2 adapter = new MyAdapter2 (context,R.layout.layou1, list);
MyAdapter2 adapter2 = new MyAdapter2 (context,R.layout.layou2 ,list);