如何在onPrepareDialog中实现setMultiChoiceItems项的值?

我显示checkbox(从数据库检索列表)的对话框,以允许用户select,删除哪些行。 因为android对话框caching,我需要刷新checkbox的计数和名称。 在我的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(不工作),但我认为其不好的select以及删除对话框和重新创build。

 protected void onPrepareDialog(final int id, final Dialog dialog) { switch (id) { case REMOVE_DIALOG_ID: ListView lv = ((AlertDialog) dialog).getListView(); lv.invalidateViews(); break; } 

感谢您的任何想法!

Solutions Collecting From Web of "如何在onPrepareDialog中实现setMultiChoiceItems项的值?"

使用AlertDialog.Builder创build项目列表时,它会在内部使用AlertDialog.Builder项目,并创build一个与您传递的数据types相关的ListAdapater 。 由于您的示例中的“项目”不像资源ID,我假设它是一个CharSequence []或一个光标。 如果您提供更多有关“项目”的信息,我可以提供一个更具体的例子。

  • 对于CharSequence[] (如String [])数据, Builder创build一个ArrayAdapter实例。
  • 对于Cursor数据, Builder会创build一个CursorAdapter

您将需要使用AlertDialog实例上的getListView getListView().getAdapter()获得对此ListAdapter的引用。

对于Cursor,在调用了requery()来更新数据集之后,可以调用notifyDataSetChanged()

由于不能用新数据“更新”数组(更改指向新实例的指针不是同一件事情,即适配器所指向的实例保持不变),因此这种情况稍微多一点。 您将需要调用适配器的add()clear()等方法来删除无效项目并添加更新项目。 在适配器数据集完全更新后,您现在可以调用notifyDataSetChanged()

希望帮助!

我花了很多时间来search相同的解决scheme,并最终在尝试使用onPrepareDialog之后用简单的东西解决了我的问题

我使用Activity的removeDialog(int)函数。 当一个对话框被解散时,Activity基本上存储了对话框的状态(出于性能方面的考虑)。 调用对话框中的removeDialog(int)将强制该活动卸载对话框的所有引用,并在屏幕显示时将其从屏幕中解除。

做了这个当我的活动失去了重点简单地添加:

  public void onStop() { removeDialog(Id_Dial); return; } 

我的技术是在onCreateDialog创build一个具有空数据的适配器,并在onPreparDialog期间完全replace适配器。

例:

 @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; } } 

在onPrepareDialog方法中,不要使用invalidateViews(),而应该尝试获取ListView的适配器,并尝试调用notifyDataSetChanged()或notifyDataSetInvalidated()。 这有帮助吗?