我即将完成我的第一个Android应用程序,但当我从我的应用程序中提供ListView的SQLite数据库中删除项目时,我正在与一个奇怪的错误作斗争。该项目被删除,如果我从ListView切换回来,它会更新,但在我这样做之前,列表不会更新。
我在这里发布了大部分课程:https://gist.github.com/2025973,但这是从文件第56行开始的相关回调:
builder.setPositiveButton(R.string.button_delete,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
databaseConnector.deleteSimpleDie(arg3);
storedDiceAdapter.notifyDataSetChanged();
}
});
我在这里做错了什么?我确信这很简单。我最初在Async中有删除,但后来我根本无法调用notifyDataSetChanged(),因为它必须从创建Cursor的线程发生。
更新
好吧,这是非常贫民窟(我想......)但我终于有了它的工作。有人想告诉我这是多么可怕的错误?基本上,我只是在回调中重新实例化整个CursorAdapter。它解决了这个问题,但我怀疑它有一些我不知道的负面副作用。
builder.setPositiveButton(R.string.button_delete,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
databaseConnector.deleteSimpleDie(arg3);
String[] from = new String[] { "name", "description" };
int[] to = new int[] { R.id.dice_name, R.id.dice_description };
storedDiceAdapter = new SimpleCursorAdapter(StoredDice.this,
R.layout.stored_dice_item, null, from, to);
setListAdapter(storedDiceAdapter);
}
});
答案 0 :(得分:2)
如果您将基础数据集设置为新的,那么适配器所持有的引用将会中断。例如,这会破坏适配器:
Globals.diceList = newDiceList;
当您想要完全更改数据集时,请尝试更多类似的功能,这样可以省去不断重新设置适配器的麻烦。
Globals.diceList.clear();
Globals.diceList.addAll(newDiceList);
虽然在你的情况下,你应该使用简单的"删除"相反的选择。这将修改列表的内容,而不会更改其引用的位置。 (Java很奇怪,我知道。)
我写了一篇更深入的文章here。
答案 1 :(得分:0)
尝试在notifyDataSetChanged()
之后添加listView.invalidate()答案 2 :(得分:0)
我认为你的问题是对话:
public void onClick(DialogInterface dialog, int which) {
databaseConnector.deleteSimpleDie(arg3);
storedDiceAdapter.notifyDataSetChanged();
}
当显示对话框时,您的活动将处于onPause
或onStop
状态,这次活动不会刷新ui,所以建议:当完成notifyDataSetChanged时,您可以忽略对话框,{{ 1}}方法,也可以调用onResume
答案 3 :(得分:0)
我之前遇到过类似的问题,但我不确定它是否完全相同。 你可以尝试一下。
它适用于我的情况。
对您的代码进行轻微修改:
builder.setPositiveButton(R.string.button_delete,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
databaseConnector.deleteSimpleDie(arg3); // Update DB
storedDiceAdapter.setNewData(listData); // Update internal list
storedDiceAdapter.notifyDataSetChanged(); // Notify changes
}
});