如何在 Android listiview 中使用不同的行布局
How to use different row layouts in Android listiview
我有两种列表视图布局。(一种用于分隔符,另一种用于列表项)
每个布局我都有两个视图持有者 类。如何在listview中正确使用这些不同的布局?
下面是我的getView()
自定义适配器的方法。
@Override
public View getView(int position, View convertView, ViewGroup parent){
int pos = position;
final Context context = parent.getContext();
int viewType = this.getItemViewType(position);
View view = convertView;
switch(viewType){
case TYPE_ITEM:
HolderItem holder_item;
if(view == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_item, parent, false);
holder_item = new HolderItem();
holder_item.title = (TextView) view.findViewById(R.id.title);
holder_item.subTitle = (TextView) view.findViewById(R.id.sub_title);
view.setTag(holder_item);
}else{
holder_item = (HolderItem) view.getTag();
}
holder_item.title.setText(titleList.get(pos));
holder_item.subTitle.setText(infoList.get(pos));
return view;
case TYPE_SEPARATOR:
HolderSeparator holder_sep;
if(view == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_header, parent, false);
holder_sep = new HolderSeparator();
holder_sep.separator = (TextView) view.findViewById(R.id.list_header);
view.setTag(holder_sep);
}else{
holder_sep = (HolderSeparator)view.getTag();
}
holder_sep.separator.setText(titleList.get(pos));
return view;
default:
return view;
}
}
public int getItemViewType(int position){
if(position == 0 || position == 5) return TYPE_SEPARATOR;
else return TYPE_ITEM;
}
class HolderItem{
TextView title;
TextView subTitle;
}
class HolderSeparator{
TextView separator;
}
有两个分隔符(在列表视图的顶部和列表视图的中间)
上面的代码首先工作正常但是当我开始滚动时它发生 ClassCastException
java.lang.ClassCastException: com.soonoo.listtest.Adapter$Holder cannot be cast to com.soonoo.listtest.Adapter$HolderItem
我认为我的代码使用了两个视图持有者,当滚动时,新列表项使用分隔符的视图持有者。我该如何解决?
如果您覆盖 getItemViewType()
,您还需要覆盖 getViewTypeCount()
,以表明您有多少种不同的行类型。
我有两种列表视图布局。(一种用于分隔符,另一种用于列表项) 每个布局我都有两个视图持有者 类。如何在listview中正确使用这些不同的布局?
下面是我的getView()
自定义适配器的方法。
@Override
public View getView(int position, View convertView, ViewGroup parent){
int pos = position;
final Context context = parent.getContext();
int viewType = this.getItemViewType(position);
View view = convertView;
switch(viewType){
case TYPE_ITEM:
HolderItem holder_item;
if(view == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_item, parent, false);
holder_item = new HolderItem();
holder_item.title = (TextView) view.findViewById(R.id.title);
holder_item.subTitle = (TextView) view.findViewById(R.id.sub_title);
view.setTag(holder_item);
}else{
holder_item = (HolderItem) view.getTag();
}
holder_item.title.setText(titleList.get(pos));
holder_item.subTitle.setText(infoList.get(pos));
return view;
case TYPE_SEPARATOR:
HolderSeparator holder_sep;
if(view == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_header, parent, false);
holder_sep = new HolderSeparator();
holder_sep.separator = (TextView) view.findViewById(R.id.list_header);
view.setTag(holder_sep);
}else{
holder_sep = (HolderSeparator)view.getTag();
}
holder_sep.separator.setText(titleList.get(pos));
return view;
default:
return view;
}
}
public int getItemViewType(int position){
if(position == 0 || position == 5) return TYPE_SEPARATOR;
else return TYPE_ITEM;
}
class HolderItem{
TextView title;
TextView subTitle;
}
class HolderSeparator{
TextView separator;
}
有两个分隔符(在列表视图的顶部和列表视图的中间)
上面的代码首先工作正常但是当我开始滚动时它发生 ClassCastException
java.lang.ClassCastException: com.soonoo.listtest.Adapter$Holder cannot be cast to com.soonoo.listtest.Adapter$HolderItem
我认为我的代码使用了两个视图持有者,当滚动时,新列表项使用分隔符的视图持有者。我该如何解决?
如果您覆盖 getItemViewType()
,您还需要覆盖 getViewTypeCount()
,以表明您有多少种不同的行类型。