这里是 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 相关的答案,但我一生都看不到它。(如果您需要查看更多信息,可以在此处找到当前活动的完整代码清单。)