Android 滚动时,listview的一些图像填充了所有listview项目

Android 滚动时,listview的一些图像填充了所有listview项目,android,android-listview,listadapter,convertview,Android,Android Listview,Listadapter,Convertview,很长一段时间以来,我在理解ListView的不同方面时遇到了问题。这里有一个问题。我知道一个解决办法,但我想知道为什么会发生 它位于扩展ArrayAdapter的类的getView方法中 我有几个列表项,每个列表项都有一个左边的图像。对于一些列表项,右侧有一个信息图像。为此,我添加了一个引发alertdialog的侦听器。 假设该应用程序在15个列表项中总共有2个信息图像。。到现在为止,一直都还不错。但是-如果我向下滚动然后滚动upp-所有其他列表项现在都填充了此信息图像。为什么会发生这种情况,

很长一段时间以来,我在理解ListView的不同方面时遇到了问题。这里有一个问题。我知道一个解决办法,但我想知道为什么会发生

它位于扩展ArrayAdapter的类的getView方法中

我有几个列表项,每个列表项都有一个左边的图像。对于一些列表项,右侧有一个信息图像。为此,我添加了一个引发alertdialog的侦听器。 假设该应用程序在15个列表项中总共有2个信息图像。。到现在为止,一直都还不错。但是-如果我向下滚动然后滚动upp-所有其他列表项现在都填充了此信息图像。为什么会发生这种情况,尽管每个视图都使用图像支架

public View getView(int position, View convertView, ViewGroup parent) {

    final ViewGroup theParent = parent;
    final int thePosition = position;
    View view = null;
    ViewHolder holder;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.main, parent, false);
        holder = new ViewHolder();
        holder.textView = (TextView) view.findViewById(R.id.label);
        holder.imageView = (ImageView) view.findViewById(R.id.icon);
        holder.infoView = (ImageView) view.findViewById(R.id.imageIcon);
        view.setTag(holder);
    }
    else {
        view = convertView;
        holder = (ViewHolder) view.getTag();
    }

    holder.textView.setText(values[position]);

    switch (thePosition) {
        case 0:
            holder.imageView.setImageResource(R.drawable.conv);
            break;
        case 1:
            holder.imageView.setImageResource(R.drawable.counting);
            break;
        case 2:
            holder.imageView.setImageResource(R.drawable.travelling);
            break;
        case 3:
            holder.imageView.setImageResource(R.drawable.love);
            break;
        case 4:
            holder.imageView.setImageResource(R.drawable.dating);
            holder.infoView.setImageResource(R.drawable.info);
            break;
        case 5:
            holder.imageView.setImageResource(R.drawable.restaurant);
            holder.infoView.setImageResource(R.drawable.info);
            break;
        case 6:
            holder.imageView.setImageResource(R.drawable.thaidishes);
            break;  
        case 7:
            holder.imageView.setImageResource(R.drawable.time_);
            break;
        case 8:
            holder.imageView.setImageResource(R.drawable.time2);
            break;  
        case 9:
            holder.imageView.setImageResource(R.drawable.colours);
            break;
        case 10:
            holder.imageView.setImageResource(R.drawable.weather);
            break;
        case 11:
            holder.imageView.setImageResource(R.drawable.directions);
            break;
        case 12:
            holder.imageView.setImageResource(R.drawable.emergency);
            break;
        case 13:
            holder.imageView.setImageResource(R.drawable.cities);
            break;
    }

    return view;
}
我以前在checbox项目上也遇到过类似的问题。当滚动出视图时,选中的项目未选中。我通过将选中项作为布尔值存储在arraylist中解决了这个问题。 有类似的解决方案吗


我提到的解决方法只是将ImageResources设置为零(0)。

getView方法返回的视图被回收,以最大限度地减少资源使用。如果其中一个包含正确信息图像的视图被回收,它仍将存在

这正是我们想要的。正如您已经发现的那样,解决方案是通过使用setImageResource(0)或setVisibility(View.GONE)或类似的方法重置正确信息图像的状态

这也适用于复选框状态等