高效的适配器有java.lang.ClassCastException吗?

时间:2013-08-22 13:52:44

标签: android android-adapter

观看here后,我尝试实现自己的高效适配器,

我的ViewHolder类几乎相同:

static class ViewHolder {
        ImageButton button;
        TextView txtView;
    }

getView方法如下:

private void getView(...) {

    if(convertView == null) {
        convertView = LayoutInflater.from(
                parent.getContext()).inflate(R.layout.linear_container,
                        parent, false);

        holder = new ViewHolder();
        convertView.setTag(holder);
    } else {
        // erro line
        holder = (ViewHolder) convertView.getTag();
    }

    LinearLayout llCustomImgViewContainer = (LinearLayout) convertView
            .findViewById(R.id.llContainer);
    llCustomImgViewContainer.setTag(viewPosition);

    return converView;
}

但是一旦新视图开始绘制,它就会给我错误

D / AndroidRuntime(748):关闭VM W / dalvikvm(748):threadid = 1:线程退出,未捕获异常(组= 0x412a4300) E / AndroidRuntime(748):致命异常:主要 E / AndroidRuntime(748): java.lang.ClassCastException:java.lang.Integer无法强制转换为com.droid.test.widget.customListView $ CustomBaseAdapter $ ViewHolder

任何人都知道这里有什么问题吗?

2 个答案:

答案 0 :(得分:6)

最初似乎是

convertView.setTag(holder);

行设置与此视图关联的标记(持有者),但稍后设置

llCustomImgViewContainer.setTag(viewPosition);

您将viewPosition设置为标记。然后可能在

holder = (ViewHolder) convertView.getTag();

您的代码尝试将Integer强制转换为ViewHolder并抛出java.lang.ClassCastException。

如果我没错,这就是“linear_container”布局的结构

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/llContainer">

    <!-- some views -->

</LinearLayout>

返回的视图
LayoutInflater.from(parent.getContext()).inflate(R.layout.linear_container,parent,false);

并从

返回视图
convertView.findViewById(R.id.llContainer);

应该是一样的。

答案 1 :(得分:0)

您正在设置一个int而不是视图:

llCustomImgViewContainer.setTag(viewPosition);

使用setTag时,在调用对象(llCustomImgViewContainer)中保存给定对象(viewPosition)。

删除最后一行:

llCustomImgViewContainer.setTag(viewPosition);