如何在onPrepareDialog中实现setMultiChoiceItems项值?

时间:2011-02-13 12:49:45

标签: android dialog

我显示复选框对话框(从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;
          }

感谢您的任何想法!

4 个答案:

答案 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()。这有帮助吗?