我显示复选框对话框(从DB检索的列表)以允许用户选择,删除哪些行。因为android对话框缓存,我需要刷新复选框的计数和名称。 在我的onCreateDialog中:
dialog = new AlertDialog.Builder( this )
.setTitle( "Remove Items" )
.setMultiChoiceItems( items, _selections, new OnMultiChoiceClickListener(){public void onClick (DialogInterface dialog, int which, boolean isChecked){}} )
.setPositiveButton("Smazat", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
deleteRow(_selections);
} })
.setNegativeButton("Storno", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
} })
.create();
如何在onPrepareDialog中刷新值(项目,_selections)? 我尝试了无效的视图,希望强制android加载项目againg(不要既不工作),但我认为它的错误选择以及删除对话框和重新创建。
protected void onPrepareDialog(final int id, final Dialog dialog) {
switch (id) {
case REMOVE_DIALOG_ID:
ListView lv = ((AlertDialog) dialog).getListView();
lv.invalidateViews();
break;
}
感谢您的任何想法!
答案 0 :(得分:6)
使用AlertDialog.Builder
创建项目列表时,它会在内部接受该项目,并创建一个ListAdapater
,它取决于您传递的数据类型。由于示例中的“items”看起来不像资源ID,我假设它是CharSequence []或Cursor。如果您提供有关“项目”的更多信息,我可以提供更具体的示例。
CharSequence[]
(如String [])数据,Builder
创建一个ArrayAdapter实例。Cursor
数据,Builder
会创建一个CursorAdapter 您需要使用AlertDialog实例上的getListView().getAdapter()
获取对此ListAdapter的引用。
对于Cursor,在调用notifyDataSetChanged()
来更新数据集后,您可以调用requery()
。
由于你不能用新数据“更新”一个数组(改变指向新实例的指针是不一样的......适配器指向的实例保持不变),这种情况多一点工作。您需要调用适配器的add()
,clear()
等方法来删除无效项并添加更新项。在适配器数据集完全更新后,您现在可以调用notifyDataSetChanged()
。
希望有帮助!
答案 1 :(得分:2)
我花了很多时间来搜索相同的解决方案并最终在尝试使用onPrepareDialog之后用简单的东西解决了我的问题
我使用Activity的removeDialog(int)函数。当一个对话框被解除时,Activity基本上存储了对话框的状态(出于我想象的性能原因)。在对话框上调用removeDialog(int)会强制活动卸载对话框的所有引用,并在显示时将其从屏幕上解除。
当我的活动失去焦点时,只需添加:
public void onStop() {
removeDialog(Id_Dial);
return;
}
答案 2 :(得分:1)
我的技巧是在onCreateDialog
中创建一个包含空数据的适配器,并在onPreparDialog
期间完全替换适配器。
示例:
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DialogMergeRegion:
title = ...
return new AlertDialog.Builder(BaseDataTabView.this)
.setTitle(title)
.setMultiChoiceItems(new CharSequence[0], null,
new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
manageSelectionList(which, isChecked);
}
})
//...
.create();
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case DialogMergeRegion: {
List<String> regionNames = ...// get the data
ListAdapter mergeAdapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_multichoice, regionNames);
AlertDialog ad = (AlertDialog) dialog;
ad.getListView().setAdapter(mergeAdapter);
break;
}
}
答案 3 :(得分:0)
在onPrepareDialog方法中,您应该尝试获取ListView的适配器并尝试调用notifyDataSetChanged()或notifyDataSetInvalidated(),而不是使用invalidateViews()。这有帮助吗?