如何获取ListView项目的视图?

9
我有两个ListView(A和B),它们的项目类型相同(一个我创建的类)。
当我点击A中的项目时,它会将此对象添加到B中,如果再次单击,则会将其删除。但是,当选择一个项目时,我会使用view.setBackgroundColor(myColor)更改其背景颜色。
我希望能够从列表B中删除该项目(它可以正常工作),但我还想重置背景颜色。 我无法弄清楚如何获取正在删除的项目的视图。
有什么想法吗?

如果您展示一些代码(相关部分),那么帮助您将会更加容易。 - Phonon
我忘了提到我使用选项卡在列表之间进行切换。关于代码,没有太复杂的地方,我扩展了ArrayAdapters,在onClick中使用view.setBackgroundColor(myColor)。 - Lucas
3个回答

10

无法保证任何特定的 ListView 项在任何给定时间都有视图。如果该项当前不在屏幕上,则可能没有视图。由于特定项可能没有视图,因此尝试获取该项的视图可能没有意义。

除此之外,由于 ListView 创建和重用视图的方式,如果您直接修改视图,将会看到一些奇怪的不良影响。当用户滚动列表时,变得可见的项目将会错误地具有与已超出可见部分的其他项目相同的背景。

我不确定下面的内容是否是实现您功能的最佳方法,因为我不知道在更改后重新构建列表的成本。这是我会采用的(可能是天真的)方法:

  1. 向数据对象添加另一个布尔成员,例如 isInSecondList
  2. 在 Adapter 中覆盖 getView()。在 getView() 中,根据项的 isInSecondList 的值将背景设置为正常或突出显示。
  3. 当从第二个列表中添加或删除项时,更新数据对象以反映更改,然后调用 Adapter 的 notifyDataSetChanged()

1
嗨,我不讨厌这个解决方案。只是我没有表达清楚,也许如果我告诉你我使用了一个单独的TabActivity来持有这两个列表,你会有所补充。 - Lucas
我没有添加布尔值,而是检查列表是否包含该对象。至于步骤2和3,我按照你的建议做了,现在它完美地工作了。谢谢! - Lucas
我认为第三种方法是在列表视图中获取视图的最佳方式。 - Milaaaad

5
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);

是的,这是在Android中获取列表视图位置的好方法,谢谢。我测试了10种或更多的方法,但这是最好的。 - Milaaaad

0

这是我所做的

private View oldSelection;

@Override
public void onItemClick(AdapterView<?> arg0, View view, int position,
        long arg3) {
        highlightSelectdListItem(position);
}

    public void highlightSelectdListItem(int position) {
    clearPreviousSelection();
    View newsItemView = mGridVIew.getChildAt(position);
    oldSelection = newsItemView;
    newsItemView.setBackgroundColor(Color.GRAY);
  }


public void clearPreviousSelection() {
    if (oldSelection != null) {
        oldSelection.setBackgroundColor(Color.TRANSPARENT);
    }

}

它不工作是因为列表视图超出屏幕范围了,例如当我通过on item click position点击第50个项目时,这段代码会返回null ---> View newsItemView = mGridVIew.getChildAt(position); 这是因为列表视图从屏幕的顶部而非列表中计算位置。 - Milaaaad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接