前言
有时,我们的ListView的Item布局并非都是一样的,比如,我们需要一个按拼音排序的列表,如下图:
![](https://img.haomeiwen.com/i1397528/c447b5dd2afd001e.png)
有的同学可能会说,直接把两种布局放在一个Item布局中,在getView中隐藏不用的那个布局不就行了。这种方法确实能够实现,也没什么问题,但是如果布局种类不止两种,而是20种或者更多呢?显然每次加载所有布局是很不明智的,而且很可能会造成界面卡顿。
其实,Google早想到了这一点,并提供了解决方法。下面介绍如何用Google提供的方法实现ListView多种Item布局。
实现
建立Adapter类,继承BaseAdapter,并实现getItemViewType和getViewTypeCount方法。
public class ComListAdapter extends BaseAdapter {
public static final int TYPE_TITLE = 0;
public static final int TYPE_COMPANY = 1;
private Context context;
private String[] comNames;
private String[] comIcons;
public ComListAdapter(Context context, String[] comNames, String[] comIcons) {
super();
this.context = context;
this.comNames = comNames;
this.comIcons = comIcons;
}
@Override
public int getCount() {
return comNames.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getItemViewType(int position) {
if (comNames[position].length() == 1) {
return TYPE_TITLE;
} else {
return TYPE_COMPANY;
}
}
@Override
public int getViewTypeCount() {
return 2;
}
@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TitleViewHolder titleHolder;
ComViewHolder comHolder;
switch (getItemViewType(position)) {
case TYPE_TITLE:
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.choose_com_list_item_title, null);
titleHolder = new TitleViewHolder();
titleHolder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(titleHolder);
} else {
titleHolder = (TitleViewHolder) convertView.getTag();
}
if (comNames[position].equals("★")) {
titleHolder.title.setText("常用快递");
} else {
titleHolder.title.setText(comNames[position]);
}
break;
case TYPE_COMPANY:
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.choose_com_list_item_com, null);
comHolder = new ComViewHolder();
comHolder.com = (TextView) convertView.findViewById(R.id.com);
comHolder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(comHolder);
} else {
comHolder = (ComViewHolder) convertView.getTag();
}
comHolder.com.setText(comNames[position]);
int id = context.getResources().getIdentifier(comIcons[position],
"drawable", context.getPackageName());
comHolder.icon.setImageResource(id);
break;
}
return convertView;
}
class TitleViewHolder {
TextView title;
}
class ComViewHolder {
TextView com;
ImageView icon;
}
}
和我们平时写的Adapter没什么区别,只是需要复写上面两个方法,需要两个(或多个)ViewHolder和Item布局。
getViewTypeCount()返回布局种类的数量
getItemViewType(int position)返回当前Item布局类型,可以在这里实现我们的逻辑
getView中我们根据当前Item布局类型,加载对应的布局。
是不是很简单,唯一的缺点就是代码量会大大增加。
迁移自我的CSDN博客
2015.11.02
网友评论