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方法,包括各种组合:
这是我最天真的尝试:
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所在活动的完整代码列表。)
答案 0 :(得分:3)
您只需要从removeCheckedItems方法再次调用fillData()方法。
每次更改数据时,都需要再次“填充”列表数据,刷新列表适配器。
Google搜索“ListActivity fillData”教程,你会得到很多很好的例子。
以下是几个好的:
如果你遇到困难,请告诉我,明天我能帮忙。我已经做了很多,所以我可以帮你解决问题。
答案 1 :(得分:0)
对于记录,我最终使用此工作的唯一方法是使用我自己的自定义行布局并在getView()
中对其进行充气,而不是使用android.R.layout.simple_list_item_multiple_choice
。当我这样做时,一切都按照我一直期望的方式工作,包括每当我通过ArrayAdapter更改数据时立即和正确地更新ListView,并且当我直接更改数据时notifyDatasetChanged()
也这样做。