ListView的多条目展示,需要手动重写2个方法:getItemViewType和getViewTypeCount()方法.
getItemViewType是获取具体的某个索引值下的条目的类型,
@Override
public int getItemViewType(int position) {
if(position % 2 ==0){
return TYPE1;
}else{
return TYPE2;
}
}
getViewTypeCount()是获取ListView条目类别的个数。
@Override
public int getViewTypeCount() {
return 2;
}
自己定义的两个样式常量,注意从零开始。
private static final int TYPE1 = 0;
private static final int TYPE2 = 1;
这里如果不从零开始会报一个异常,我给大家摘要一下:
java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
at android.widget.AbsListView$RecycleBin.scrapActiveViews(AbsListView.java:6798)
这个异常的原因就是getItemViewType 范围 0 - count-1 。
**下面看下getView中如何实现的:**
//获取样式类型
int type = getItemViewType(position);
//判断
switch (type){
//第一个布局
case TYPE1 :
if(convertView == null){
convertView = View.inflate(context , R.layout.item1,null);
vh1 = new ViewHolder1(convertView);
}else{
vh1 = (ViewHolder1) convertView.getTag();
}
//设置内容
vh1.setDatas(getItem(position));
break;
//第二个布局
case TYPE2 :
if(convertView == null){
convertView = View.inflate(context,R.layout.item2,null);
vh2 = new ViewHolder2(convertView);
}else{
vh2 = (ViewHolder2) convertView.getTag();
}
//设置内容
vh2.setDatass(getItem(position));
break;
}
return convertView;
}
public class ViewHolder1 {
ImageView imageView;
TextView title;
TextView id;
public ViewHolder1 (View itemView){
imageView = itemView.findViewById(R.id.image1_l);
title = itemView.findViewById(R.id.title1_l);
id = itemView.findViewById(R.id.id1_l);
itemView.setTag(this);
}
private void setDatas(DataItem item) {
title.setText(item.getTitle());
id.setText(item.getId());
}
}
public class ViewHolder2{
TextView title2;
public ViewHolder2 (View itemView) {
title2 = itemView.findViewById(R.id.title2_l);
itemView.setTag(this);
}
public void setDatass (DataItem dataItem){
title2.setText(dataItem.getTitle());
}
}
主要就是上面一些带有文字标识的代码块,其他的和ListView无差异。