viewHolder无法强制转换viewHolder

时间:2016-06-19 22:12:15

标签: android listview view android-adapter android-viewholder

我试图显示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)时,它完美地运行,并且编写此代码的类是适配器。

欢迎任何帮助。

谢谢:)

1 个答案:

答案 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()
}