删除选中的列表项时,无法使ListView与ListArray保持同步

时间:2011-11-16 00:57:24

标签: android listview android-arrayadapter checkedtextview

Android和Java noob在这里,虽然我多年来涉足多种语言。这一周一直让我疯狂。

尝试编写我的第一个应用程序,这是陈词滥调的购物清单应用程序,其中ListView由CheckedTextView项目组成(由android.R.layout.simple_list_item_multiple_choice提供)。 ListView设置为CHOICE_MODE_MULTIPLE。

ListView的后端是一个名为shoppingItems的ArrayList,其中ShoppingListItem被简单地定义为:

public class ShoppingListItem {

    public String name;
    public Boolean checked;

    // The obvious constructors here...

}

我有一个带有过度getView()方法的ArrayAdapter:

shoppingListAdapter = new ArrayAdapter<ShoppingListItem>
                        (this,
                        android.R.layout.simple_list_item_multiple_choice,
                        android.R.id.text1,
                        shoppingItems)
{
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        CheckedTextView rowView = (CheckedTextView)convertView;

        if (rowView==null){
            LayoutInflater inflater = getLayoutInflater();
            rowView = (CheckedTextView)inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);
        }               
        rowView.setText(shoppingItems.get(position).name);
        rowView.setChecked(shoppingItems.get(position).checked);
        return rowView;
    }
};

一切正常 - 添加项目,编辑项目,通过上下文菜单删除单个项目 - 除了通过屏幕底部的“删除”按钮删除所有选中的项目。

我一定尝试过半打不同的方式编写我的removeCheckedItems方法,包括各种组合:

  • 使用列表适配器删除已检查的项目(我从中读过的就是应该工作的方式)
  • 直接从ArrayList中删除已检查的项目,然后调用notifyDatasetChanged()
  • 从ListView中明确删除子视图
  • 迭代ListView的getCheckedItemPositions()结果,而不是整个列表

这是我最天真的尝试:

private void removeCheckedItems(){

    ShoppingListItem item;
    for (int i=0; i< adapter.getCount(); i++) {
        item = shoppingListAdapter.getItem(i);
        if (shoppingListView.isItemChecked(i)){
            item = shoppingItems.get(i);
            shoppingListAdapter.remove(item);
        }
    }
    removeBtn.setEnabled(false);
}

但是我这样做了:ListView中的复选框只是不与ShoppingItems ArrayList中的数据保持同步。具体来说,如果我开始:

Item one   [ ]
Item two   [ ]
Item three [ ]
列表中的

,然后检查第一项:

Item one   [x]
Item two   [ ]
Item three [ ]

然后单击我的“删除”按钮,通过弹出对话框确认操作,第一个项目消失,但第一行中的复选框仍保持选中状态:

Item two   [x]
Item three [ ]

此时,我通过调试消息等知道ArrayList的内容是正确的 - 即它包含两个具有正确名称的ShoppingListItem项,两个'checked'字段都设置为false。

我确定我遗漏了一些显而易见的东西,但尽管在这里阅读了大量的例子,甚至更多与ListView相关的答案,但我无法看到它的生命。 (如果您需要查看更多信息,可以找到here所在活动的完整代码列表。)

2 个答案:

答案 0 :(得分:3)

您只需要从removeCheckedItems方法再次调用fillData()方法。

每次更改数据时,都需要再次“填充”列表数据,刷新列表适配器。

Google搜索“ListActivity fillData”教程,你会得到很多很好的例子。

以下是几个好的:

如果你遇到困难,请告诉我,明天我能帮忙。我已经做了很多,所以我可以帮你解决问题。

答案 1 :(得分:0)

对于记录,我最终使用此工作的唯一方法是使用我自己的自定义行布局并在getView()中对其进行充气,而不是使用android.R.layout.simple_list_item_multiple_choice。当我这样做时,一切都按照我一直期望的方式工作,包括每当我通过ArrayAdapter更改数据时立即和正确地更新ListView,并且当我直接更改数据时notifyDatasetChanged()也这样做。