观看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
任何人都知道这里有什么问题吗?
答案 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);