当标志着ListView中它重复其他项目

问题描述:

如果我想,以纪念我做下面的代码的第二项的项(改变背景颜色): 此代码是从我的适配器,扩展ArrayAdapter:当标志着ListView中它重复其他项目

if (convertView == null) { 
     LayoutInflater mInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = mInflater.inflate(R.layout.channel_list, null); 
    } 

    MyContent o = items.get(position); 
    if (o != null) { 
     TextView tt = (TextView) convertView.findViewById(R.id.toptext); 
     TextView bt = (TextView) convertView.findViewById(R.id.bottomtext); 
     if (tt != null) { 
      tt.setText(o.Top());        
     } 
     if(bt != null){ 
      bt.setText(o.Bottom()); 
     } 
     if(position == 2) { 
      convertView.setBackgroundColor(R.color.selectem_color); 
     } 
    } 
    return convertView; 

它会显示列表视图,但会在此项目之后的第9个项目(第11项第13等等)标记。

有谁知道是什么原因?

有两种情况可以调用getView方法。如果converView为空,则必须创建一个新的视图。如果它不为空,那么由于用户滚动而离开屏幕的项目将被回收并返回到您的方法以供重用。

此对象是之前列表中显示的对象。你必须检查它的状态并将它的每个属性设置为你想要的值。你不能像对象是新的那样标记对象并且不标记对象。在你的getview方法中做这样的事情。

if(item is selected) {  
    convertView.setBackgroundColor(selected color); 
} else { 
    convertView.setBackgroundColor(not selected color); 
} 

在你的代码中,如果缺少else的情况。

+0

嗨,你的回答是正确的,但它不能解决它。回收的元素现在获得了不同的位置,但这是方向。 谢谢你的回答! – Adi 2010-05-31 13:54:30

+0

对不起阿迪,但我不可能知道你的代码如何工作。将其更改为更类似代码的伪代码。 重要的是,你不能相信convertView是一个干净的新对象,它也可能是一个适配器之前更改过的对象。 – Janusz 2010-05-31 14:12:07

+0

适用于带有“convertView.setBackgroundResource”..但不适用于颜色的图像 我认为它可能与绘图缓存相关 – Adi 2010-05-31 14:32:34

您没有重置背景颜色。请记住,行被回收 - 这就是convertView的用途。只需添加一个else {}即可将颜色设置为position不是2时的任何正常状态,并且您将会好起来。

+0

+1的工作方案:d – RoflcoptrException 2010-05-30 18:44:18

+0

现在尝试它 谢谢:) – Adi 2010-05-30 19:03:02

+0

我想要的默认颜色 时convertView不为空,我试过 如果{ 回报convertView;(位置= 2!) } 没有帮助 也没有返回语句(并插入默认颜色)没有帮助 – Adi 2010-05-30 19:56:02