我正在使用ViewHolder,以便为listview的每一行显示不同的背景。基本上,背景图像来自服务器并加载到ImageView
。然后,我将RelativeLayout
背景设置为ImageView
。但是,在实现viewHolder以实现此目的时,我在行中获得了类转换异常:
viewHolder = (ViewHolder) rowView.setTag();
以下是我的完整实施:
MyArrayAdapter.java
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder viewHolder;
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
rowView = inflater.inflate(resourceId, parent, false);
viewHolder = new ViewHolder();
viewHolder.imageBackground = (ImageView) rowView.findViewById(R.id.imageBKG);
viewHolder.rowlist = (RelativeLayout) rowView.findViewById(R.id.row_mallx);
rowView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) rowView.getTag();
}
Mall mall = malls.get(position);
viewHolder.rowlist.setBackground(viewHolder.imageBackground.getDrawable());
ImageLoader.getInstance().displayImage(mall.iconWide, viewHolder.imageBackground, Utility.displayImageOptions);
return rowView;
}
static class ViewHolder {
public ImageView imageBackground;
public RelativeLayout rowlist;
}
row_list.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_mallx"
android:layout_width="match_parent"
android:layout_height="155dp">
<ImageView
android:id="@+id/imageBKG"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:scaleType="fitXY"
android:visibility="invisible" />
</RelativeLayout>
错误日志
java.lang.ClassCastException: java.lang.String cannot be cast to com.XXXXXXXXXXXXXXXX.adapter.MyArrayAdapter$ViewHolder
at com.XXXXXXXXXXXXXXXX.adapter.MyArrayAdapter.getView(MyArrayAdapter.java:68)
at android.widget.AbsListView.obtainView(AbsListView.java:2413)
at android.widget.ListView.makeAndAddView(ListView.java:1769)
at android.widget.ListView.fillDown(ListView.java:672)
at android.widget.ListView.fillGap(ListView.java:636)
答案 0 :(得分:0)
这里的问题在于你正在使用的inflater。
这是初始化Inflater
的正确方法,我建议您在Adapter的构造函数中初始化它,而不是每次调用getView(..)
时重新初始化它。
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
除此之外,你还应该像这样膨胀你的rowView:
rowView = inflater.inflate( resourceId, null );
而不是像这样初始化它:
rowView = inflater.inflate(resourceId, parent, false);
更具体地说,错误发生在这条线上:
else {
viewHolder = (ViewHolder) rowView.getTag();
}
当你试图提取&#39; ViewHolder&#39;来自rowView标签的对象,而不是获得某种字符串。
我希望这会有所帮助。
答案 1 :(得分:0)
这是你错过的
holder =(ViewHolder)rowView.getTag();
public View getView(final int position, View convertView, ViewGroup arg2) {
ViewHolder viewHolder;
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflator = ((Activity) context).getLayoutInflater();
rowView = inflator.inflate(R.layout.child_row, arg2, false);
viewHolder = new ViewHolder();
viewHolder.imageBackground = (ImageView) rowView
.findViewById(R.id.imageBKG);
viewHolder.rowlist = (RelativeLayout) rowView
.findViewById(R.id.row_mallx);
rowView.setTag(viewHolder);
} else {
// rowView = convertView;
viewHolder = (ViewHolder) rowView.getTag();
}
holder = (ViewHolder) rowView.getTag();//This is your ultimate problem
viewHolder.rowlist.setBackgroundColor(Color.BLACK);
holder.imageBackground.setVisibility(View.VISIBLE);
holder.imageBackground.setImageResource(R.drawable.ic_launcher);
return rowView;
}
希望这会有所帮助:) 快乐的编码。