Android 同一个数据适配器(Adapter)支持不同布局。

最近做项目有个需求,在两个页面都需要显示同一种数据的列表,但是页面布局不一样。

为了代码重复利用,想到以下两种方案在同一个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);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值