0

这里是 Android 和 Java 新手,尽管这些年来我涉足各种语言。这让我整个星期都发疯了。

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

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

public class ShoppingListItem {

    public String name;
    public Boolean checked;

    // The obvious constructors here...

}

我有一个 ArrayAdapter 有一个被覆盖的 getView() 方法:

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 项,它们的“已检查”字段都设置为 false。

我确定我遗漏了一些明显的东西,但是尽管阅读了许多示例,甚至在这里阅读了更多与 ListView 相关的答案,但我一生都看不到它。(如果您需要查看更多信息,可以在此处找到当前活动的完整代码清单。)

4

2 回答 2

3

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

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

做一个谷歌搜索'ListActivity fillData'教程,你会得到很多很好的例子。

这里有几个不错的:

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

于 2011-11-16T01:14:20.410 回答
0

作为记录,我最终让它工作的唯一方法是使用我自己的自定义行布局并将其膨胀getView(),而不是使用android.R.layout.simple_list_item_multiple_choice. 当我这样做时,一切都按照我一直期望的方式工作,包括每当我通过 ArrayAdapter 更改数据时,ListView 会立即正确更新,notifyDatasetChanged()当我直接更改数据时也会这样做。

于 2012-03-12T01:46:10.997 回答