我试图显示2个不同的项目视图,具体取决于我在Array列表中的内容。没有条件(如果)没有问题,但是当我放入条件并因此我必须处理2个viewHolders时,我得到一个错误,告诉viewHolder不能由viewHolder强制转换。
这是我的代码:
@Override
public View getView(int position, View view, ViewGroup parent) {
bind(getItem(position), view);
return view;
}
private void bind(final Eddystone eddystone, final View view) {
List<Content> contents = ... ;
if(contents.get(i).content_type_id==2){
ViewHolder holder = (ViewHolder) view.getTag();
// some code here
}
else {
ViewHolderVideo holder = (ViewHolderVideo) view.getTag();
// some code here
}
}
错误发生在第二个持有者身上(在其他情况下)。
请记住,当我删除条件(else)时,它完美地运行,并且编写此代码的类是适配器。
欢迎任何帮助。
谢谢:)
答案 0 :(得分:1)
问题是ListView正在回收错误的行。目前,ListView认为所有行都是相同的,因为您还没有告诉它有多种类型的行。
您的适配器需要实施getItemViewType()
和getViewTypeCount()
。这两个方法告知ListView
行的类型数量以及哪些行类型对应于哪些位置,以便它可以回收正确的行视图。
根据您发布的内容,您的实施可能会是这样的:
private static final int VIEW_TYPE_DEFAULT = 0;
private static final int VIEW_TYPE_VIDEO = 1;
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
// return a value between zero (inclusive) and the total item type count (exclusive)
if (contents.get(position).content_type_id == 2) {
return VIEW_TYPE_VIDEO;
}
return VIEW_TYPE_DEFAULT:
}
然后,您可以在getView()
:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
if (type == VIEW_TYPE_VIDEO) {
return buildVideoRow(position, convertView, parent);
} else if (type == VIEW_TYPE_DEFAULT) {
return buildDefaultRow(position, convertView, parent);
}
return null; // or throw an IllegalStateException, because something is wrong if you get here.
}
private View buildVideoRow(int position, View convertView, ViewGroup parent) {
VideoViewHolder holder;
if (convertView != null) {
holder = (VideoViewHolder) convertView.getTag();
} else {
convertView = ... // inflate row here
// set the tag, etc.
}
... // bind views here
return convertView;
}
private View buildDefaultRow(int position, View convertView, ViewGroup parent) {
// similar implementation as buildVideoRow()
}