Android Imageview未通过listview适配器正确显示

Android Imageview未通过listview适配器正确显示,android,listview,imageview,adapter,Android,Listview,Imageview,Adapter,在我的适配器中,我有三种不同的视图,使用黄色、橙色和红色作为不同的文本颜色。为了配合这些,我尝试将三种不同的图像作为缩略图(hhy、hho、hhr)。当它运行时,图像与其对应的视图项不匹配,我在listview中过早或延迟获取hho和hhy项目。我的imageview布局名称正确,因此我不确定它们为什么显示不正确 positemadapter.java @Override public View getView(int position, View convertView, ViewGr

在我的适配器中,我有三种不同的视图,使用黄色、橙色和红色作为不同的文本颜色。为了配合这些,我尝试将三种不同的图像作为缩略图(hhy、hho、hhr)。当它运行时,图像与其对应的视图项不匹配,我在listview中过早或延迟获取hho和hhy项目。我的imageview布局名称正确,因此我不确定它们为什么显示不正确

positemadapter.java

@Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder viewHolder;
        int listViewItemType = getItemViewType(position);

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.postitem, null);

            viewHolder = new ViewHolder();
            //viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);

            if (listViewItemType == TYPE_short) {
                viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
                viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
            } else if (listViewItemType == TYPE_med) {
                viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
                viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1);
            } else {
                viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
                viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2);
            }
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (listViewItemType == TYPE_short) {
            viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
            viewHolder.itemThumbView.setImageResource(R.drawable.hhy);
        } else if (listViewItemType == TYPE_med) {
            viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
            viewHolder.itemThumbView.setImageResource(R.drawable.hho);
        } else {
            viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
            viewHolder.itemThumbView.setImageResource(R.drawable.hhr);
        }

        return convertView;
    }
}
以及相关的布局positem.xml

 <ImageView
        android:id="@+id/itemThumb"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@drawable/hhy"
        android:scaleType="centerCrop"
        android:layout_marginRight="5dp"/>

    <ImageView
        android:id="@+id/itemThumb1"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@drawable/hho"
        android:scaleType="centerCrop"
        android:layout_marginRight="5dp"/>

    <ImageView
        android:id="@+id/itemThumb2"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@drawable/hhr"
        android:scaleType="centerCrop"
        android:layout_marginRight="5dp"/>

    <TextView
        android:id="@+id/itemTitleLabel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/itemThumb"
        android:layout_toRightOf="@id/itemThumb"
        android:maxLines="2"
        android:textIsSelectable="false"
        android:textSize="16sp"
        android:textStyle="bold"
        android:textColor="#ffff00"
        android:ellipsize="end"
        />

    <TextView
        android:id="@+id/itemTitleLabel1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/itemThumb"
        android:layout_toRightOf="@id/itemThumb"
        android:maxLines="2"
        android:textIsSelectable="false"
        android:textSize="16sp"
        android:textStyle="bold"
        android:textColor="#ffa500"
        android:ellipsize="end"
         />

    <TextView
        android:id="@+id/itemTitleLabel2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/itemThumb"
        android:layout_toRightOf="@id/itemThumb"
        android:maxLines="2"
        android:textIsSelectable="false"
        android:textSize="16sp"
        android:textStyle="bold"
        android:textColor="#ff0000"
        android:ellipsize="end"
         />

正在发生的事情的图像;

好吧,我的问题是,当listview视图被回收时,它们正在覆盖或无法覆盖预先存在的图像/文本。我的解决方案是使用以下代码。如果有人知道你应该如何解决这个问题,我很想听听:P

positemAdapter.java(视图持有者)


好吧,我的问题是,当listview视图被回收时,它们正在覆盖或无法覆盖预先存在的图像/文本。我的解决方案是使用以下代码。如果有人知道你应该如何解决这个问题,我很想听听:P

positemAdapter.java(视图持有者)


你的问题中有一些问题。回收的视图只需要膨胀/创建足够的时间,以便第一次完全填充ListView的可见部分。然后在滚动时循环使用,而不是再次创建

这意味着此块只调用前几次:

if (convertView == null) {
        convertView = inflater.inflate(R.layout.postitem, null);

        viewHolder = new ViewHolder();
        //viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);

        if (listViewItemType == TYPE_short) {
            viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
            viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
        } else if (listViewItemType == TYPE_med) {
            viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
            viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1);
        } else {
            viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
            viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2);
        }
        convertView.setTag(viewHolder);
    }
对于后续回收,您的ViewHolder可能指向一个意外资源。如果当前项目为类型_-med,则viewHolder.itemThumbView可能是使用其他资源引用创建的(即创建时的类型_-short)。修复此问题仍然无法解决您的问题,因为您还有另外两个ImageView/TextView

我看不出有任何明显的需要有多个ImageView/TextView,因此,与其设置所有内容的可见性,更普遍接受的方法是:

static class ViewHolder
{
    private TextView mTextViewTitle;
    private ImageView mImageViewThumb;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder viewHolder;
    Item i = datas.get(position);
    int listViewItemType = i.viewtype;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.postitem, null);

        viewHolder = new ViewHolder();

        viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.itemTitleLabel);
        viewHolder.mImageViewThumb = (ImageView) convertView.findViewById(R.id.itemThumb);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.mTextViewTitle.setText(i.itemTitle);

    if (listViewItemType == TYPE_short) {
        viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
        viewHolder.mImageViewThumb.setImageResource(R.drawable.hhy);
    } else if (listViewItemType == TYPE_med) {
        viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
        viewHolder.mImageViewThumb.setImageResource(R.drawable.hho);
    } else {
        viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ff0000"));
        viewHolder.mImageViewThumb.setImageResource(R.drawable.hhr);
    }

    return convertView;
}
最好在参考资料中定义颜色,但我将把它留到另一个讨论中

您的新XML:

<ImageView
    android:id="@+id/itemThumb"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:scaleType="centerCrop"
    android:layout_marginRight="5dp" />

<TextView
    android:id="@+id/itemTitleLabel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignTop="@id/itemThumb"
    android:layout_toRightOf="@id/itemThumb"
    android:maxLines="2"
    android:textIsSelectable="false"
    android:textSize="16sp"
    android:textStyle="bold"
    android:ellipsize="end" />

您的问题中存在一些问题。回收的视图只需要膨胀/创建足够的时间,以便第一次完全填充ListView的可见部分。然后在滚动时循环使用,而不是再次创建

这意味着此块只调用前几次:

if (convertView == null) {
        convertView = inflater.inflate(R.layout.postitem, null);

        viewHolder = new ViewHolder();
        //viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);

        if (listViewItemType == TYPE_short) {
            viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
            viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
        } else if (listViewItemType == TYPE_med) {
            viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
            viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1);
        } else {
            viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
            viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2);
        }
        convertView.setTag(viewHolder);
    }
对于后续回收,您的ViewHolder可能指向一个意外资源。如果当前项目为类型_-med,则viewHolder.itemThumbView可能是使用其他资源引用创建的(即创建时的类型_-short)。修复此问题仍然无法解决您的问题,因为您还有另外两个ImageView/TextView

我看不出有任何明显的需要有多个ImageView/TextView,因此,与其设置所有内容的可见性,更普遍接受的方法是:

static class ViewHolder
{
    private TextView mTextViewTitle;
    private ImageView mImageViewThumb;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder viewHolder;
    Item i = datas.get(position);
    int listViewItemType = i.viewtype;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.postitem, null);

        viewHolder = new ViewHolder();

        viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.itemTitleLabel);
        viewHolder.mImageViewThumb = (ImageView) convertView.findViewById(R.id.itemThumb);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.mTextViewTitle.setText(i.itemTitle);

    if (listViewItemType == TYPE_short) {
        viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
        viewHolder.mImageViewThumb.setImageResource(R.drawable.hhy);
    } else if (listViewItemType == TYPE_med) {
        viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
        viewHolder.mImageViewThumb.setImageResource(R.drawable.hho);
    } else {
        viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ff0000"));
        viewHolder.mImageViewThumb.setImageResource(R.drawable.hhr);
    }

    return convertView;
}
最好在参考资料中定义颜色,但我将把它留到另一个讨论中

您的新XML:

<ImageView
    android:id="@+id/itemThumb"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:scaleType="centerCrop"
    android:layout_marginRight="5dp" />

<TextView
    android:id="@+id/itemTitleLabel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignTop="@id/itemThumb"
    android:layout_toRightOf="@id/itemThumb"
    android:maxLines="2"
    android:textIsSelectable="false"
    android:textSize="16sp"
    android:textStyle="bold"
    android:ellipsize="end" />