onItemClick似乎选择了视图?

时间:2012-01-04 17:41:29

标签: android listview

基本上,我的android应用程序中有一个ListView。我希望用户可以通过单击选择多行。为了实现这一点,我创建了一个实现onItemClickListener的类,ListView将其设置为OnItemClick侦听器。

这是侦听器中的代码:

public void onItemClick(AdapterView<?> parentAdapterView, View viewSelected, int pos, long id) {
    if(selectedItems.contains(viewSelected)) {
        //remove it from the selected list.
        selectedItems.remove(viewSelected);
        viewSelected.setBackgroundColor(Color.BLACK);
    }
    else {
        selectedItems.add(viewSelected);
        viewSelected.setBackgroundColor(Color.RED);
    }
}

selectedItems只是一个视图列表(List),我用它来跟踪所有已选择的项目。

这样可以正常工作,直到项目数导致列表溢出(因此,列表变为可滚动)。然后,当点击一个项目时,另一个项目会在列表的下方突出显示(除了第一项)?

想不出为什么会发生这种情况?我在Google上搜索过,但无济于事......

我很感激有关此事的任何帮助。

干杯

编辑:我用来为列表视图提供视图的代码很简单:

uiListViewRes = R.layout.main_list_item;
ListView overTwoDaysView = (ListView) findViewById(R.id.overtwolistview);

String[] from = {"_id","foodItemName", "expire", "dateAdded"};
int[] to = {R.id.itemIDhidden,R.id.name, R.id.expiry, R.id.dateAddedLabel};

SimpleAdapter overTwoDaysAdapter = new SimpleAdapter(this, adapter.getAllItemsOverTwoDays(), uiListViewRes, from, to);

overTwoDaysView.setAdapter(overTwoDaysAdapter);

3 个答案:

答案 0 :(得分:0)

如果你使用this.invalidate(),会发生什么?

不确定它是否会起作用,看起来你正在做的一切......重绘可能有所帮助。

public void onItemClick(AdapterView<?> parentAdapterView, View viewSelected, int pos, long id) {
    if(selectedItems.contains(viewSelected)) {
        //remove it from the selected list.
        selectedItems.remove(viewSelected);
        viewSelected.setBackgroundColor(Color.BLACK);
    }
    else {
        selectedItems.add(viewSelected);
        viewSelected.setBackgroundColor(Color.RED);
    }
    this.invalidate();
}

如果您每次遇到问题时都重复使用该视图,但这是我在此代码中唯一可以考虑的问题。

答案 1 :(得分:0)

问题是ListView重用了Views以获得更好的性能。

因此,ListView只分配X个视图,然后尝试重用不可见的视图 - 通过更改视图的属性。

这意味着您无法保存视图/设置视图的背景,因为稍后将在ListView中使用相同的View实例。


有几种方法可以解决这个问题:

  1. 您可以查看ListView的CHOICE_MODE_MULTIPLE

    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    

    示例:http://www.vogella.de/articles/AndroidListView/article.html

  2. 您可以保存行的ID或位置,并在自定义适配器中使用它来相应地设置背景。

答案 2 :(得分:0)

我认为我现在看到了问题,因为您使用简单适配器的默认实现,不会保留复选框的状态。

以下响应定义了一个自定义适配器,它将维护单个列表项的状态

Custom Adapter