在Android中的MultiChoice AlertDialog中切换复选框

Vin*_*tti 12 android

嗨,

我创建了MultiChoice AlertDialog AlertDialog有五个带复选框的列表项.当我选中First复选框时,如果选中了列表中的其他复选框,则会自动取消选中它们,反之亦然.

我正在检查onMultiChoiceClickListener()onClick方法中 的isChecked状态并调用 showDialog(DIALOG_MULTIPLE_CHOICE); 通过更新boolean [] checkedItems; 重新创建对话框,但我无法实现它.如果您有任何建议,请指导我正确的方式.

有没有办法重新创建单击按钮单击的AleartDialog onClick事件.

下面的一些示例代码:

case DIALOG_MULTIPLE_CHOICE:
final String[] lJobTypes = { "Item1", "Item2", "Item3","Item4", "Item5" };
    return new AlertDialog.Builder(JoblistPage.this)
    // .setIcon(R.drawable.logo)
    .setTitle("Title Here")
    // .setCustomTitle(m_Title)
    .setMultiChoiceItems(lTypes, m_Selections,
        new DialogInterface.OnMultiChoiceClickListener() {

            public void onClick(DialogInterface dialog,int whichButton, boolean isChecked) {
                /* User clicked on a check box do some stuff */
                if (isChecked) {
                    m_CheckCount++;
                    //Toggle the Radio button Check status
                } else {
                    m_CheckCount--;
                }
                                                }
        }).setPositiveButton("Ok",
        new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog,
                    int whichButton) {
                    }
                }).create();
Run Code Online (Sandbox Code Playgroud)

关心Vinayak

bee*_*per 21

不要重新创建对话框,只需切换当前对话框中的复选框即可.您的onMultiChoiceClickListener可以跟踪当前活动的复选框(如果有),并在选择其他复选框时取消选中它.这是一个完整的测试工作示例:

package com.stackoverflow.beekeeper;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;

public class StackOverflowTest extends Activity {
  /** Called when the activity is first created. */
  @Override public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  private int mSelected = -1;

  @Override protected void onResume() {
    super.onResume();
    final Builder build = new Builder(this);
    build.setTitle("List selection");
    build.setCancelable(true);
    final String[] strings = new String[]{"Cow", "Horse", "Goat"};
    final OnMultiChoiceClickListener onClick =
      new OnMultiChoiceClickListener() {
        @Override public void onClick(final DialogInterface dialog,
                                      final int which, final boolean isChecked) {

          if (isChecked) {
            if ((mSelected != -1) && (mSelected != which)) {
              final int oldVal = mSelected;
              final AlertDialog alert = (AlertDialog)dialog;
              final ListView list = alert.getListView();
              list.setItemChecked(oldVal, false);
            }
            mSelected = which;
          } else
            mSelected = -1;
        }
      };
    build.setMultiChoiceItems(strings, null, onClick);
    build.setPositiveButton("Done", new OnClickListener() {
      @Override public void onClick(final DialogInterface dialog,
                                    final int which) {
        String message = null;
        if (mSelected == -1)
          message = "You didn't select anything.";
        else
          message = "You selected '" + strings[mSelected] + "'";
        Toast.makeText(StackOverflowTest.this, message, Toast.LENGTH_LONG).show();
      }
    });
    build.show();
  }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是:必须在"setMultiChoiceItems"调用中为"checkedItems"参数指定"null" - 否则"setItemChecked"调用将无法按预期工作.它最终会使用该数组存储已检查的状态,而"setItemChecked"将无法正确更新它,因此一切都会混淆.奇怪,但是真的.


Haw*_*kee 6

很长一段时间我一直在努力解决这个问题.我维护每个项目的"已检查"状态数组,并在视觉上更改setItemChecked值时更改该值.然后,当单击完成按钮时,我遍历"已选中"以将值保存到我的数据库中.

builder.setMultiChoiceItems(cats, checked, new DialogInterface.OnMultiChoiceClickListener() {
        public void onClick(DialogInterface dialog, int item, boolean check) {
            if(cats[item].equals("All Categories")) {
                AlertDialog d = (AlertDialog) dialog;
                ListView v = d.getListView();
                int i = 0;
                while(i < cats.length) {
                    v.setItemChecked(i, check);
                    checked[i] = check;
                    i++;
                }
            }
            checked[item] = check;
        }
    });
Run Code Online (Sandbox Code Playgroud)