在Android中迭代ListView项

时间:2011-01-17 05:36:30

标签: android listview iteration listviewitem

我想将项目列表迭代到ListView中。由于getChildCount()函数的奇怪行为(仅返回可见项目计数),下面的代码不足以将所有项目迭代到列表中。

for (int i = 0; i < list.getChildCount(); i++) {
   item = (View)list.getChildAt(i);
   product = (Product)item.getTag();
   // make some visual changes if product.id == someProductId
}

我的屏幕显示7个结果,当列表中有超过7个项目时,无法访问第8个项目。只有可见项目..

我应该使用ListIterator吗?

感谢。

3 个答案:

答案 0 :(得分:1)

您需要自定义列表适配器的getView()方法,并将检查放入其中以检查当前项目的ID是否匹配:

Product product = items.get(position);
if(product.id == someProductId) {
    //make visual changes
} else {
    //reset visual changes to default to account for recycled views
}

由于通常只有可见项仅在特定时间存在,因此只要需要查看更多,就会调用getView。它们是在那时创建的,通常是从列表中现在不可见的项目中回收视图(因此,如果条件不匹配,您希望重置更改的原因)。

答案 1 :(得分:1)

所以@kcoppock解决了你的第一个问题,似乎你有另一个问题。如何更新视图项? Android SMS应用程序显示了一种方式:

  1. 创建您自己的列表视图项,如下所示:

    public class MyListItem extends RelativeLayout {
    ...
    }
    
    列表视图项目布局文件中的

    < MyListItem  android:layout_width=.....>
    ...
    </ MyListItem >
    
  2. 并且在您的代码中,当您可以看到您的视图项时,将MyListItem注册为数据更改的侦听器(数据取决于您)。我的意思是,当您的数据发生变化时,您可以直接更新该项目。

  3. 查看SMS应用程序源代码以了解更多信息。

答案 2 :(得分:0)

ListView(7)中的视图数量与适配器中的项目数量(大于7)不同。尝试使用BaseAdapter。