使用ViewHolder的ListView类强制转换错误

时间:2015-02-17 05:19:20

标签: android android-listview

我正在使用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)

2 个答案:

答案 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;
}

希望这会有所帮助:) 快乐的编码。