как установить содержимое setSingleChoiceItems в onPrepareDialog? - PullRequest
7 голосов
/ 27 января 2011

Ребята, в onCreateDialog у меня есть это:

case DIALOG_REVIEW: {
    if (bundle.containsKey("POSITION")) {
    final int position = bundle.getInt("POSITION");
    ArrayList<String> alterNumbers = numbers.get(position);
    final String[] phoneNums = new String[alterNumbers.size()];
    for (int i = 0; i < alterNumbers.size(); i++) {
        phoneNums[i] = alterNumbers.get(i);
    }
    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setTitle(names.get(position) + "'s number(s)");
    dialog.setSingleChoiceItems(phoneNums, 0,
        new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog,
                int which) {
            // get selected item and close the dialog
            String selectedNumber = phoneNums[which];
            updateUserSelectedNumber(position , selectedNumber);
            }
        });
    return dialog.create();
    }

, который работает и отлично.

НО обратите внимание на строку

dialog.setSingleChoiceItems(phoneNums, 0,
        new DialogInterface.OnClickListener() {

phoneNums предполагаютменяться каждый раз, когда всплывает диалоговое окно.Я переопределил метод onPrepareDialog, но я не знаю, как назначить ему новые значения.а также там нет setSingleChoiceItems.

вот мой метод onPrepareDialog

case DIALOG_REVIEW: {
    final int position = bundle.getInt("POSITION");
    ArrayList<String> alterNumbers = numbers.get(position);
    final String[] phoneNums = new String[alterNumbers.size()];
    for (int i = 0; i < alterNumbers.size(); i++) {
    phoneNums[i] = alterNumbers.get(i);
    }
    AlertDialog alertDialog = (AlertDialog) dialog;
    alertDialog.setTitle(names.get(position) + "'s number(s)");
    ???
    break;
}

Какое решение?заранее спасибо, ребята.

Ответы [ 2 ]

10 голосов
/ 30 марта 2011

Вам необходимо использовать getListView метод из класса AlertDialog.Затем используйте метод setItemChecked для возвращаемого объекта.Пример:

alertDialog.getListView().setItemChecked(1, true);

7 голосов
/ 28 сентября 2011

Я только что столкнулся с той же проблемой:

Два решения:

1 / Быстро и грязно

Удалять диалог каждый раз, когда вы закончите с ним => onPrepareDialog не будет вызываться, поэтому у вас не будет проблем с обновлением данных:

protected Dialog onCreateDialog(int id) {
    ...
    case DIALOG_REVIEW: {
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setTitle(names.get(position) + "'s number(s)");
        dialog.setSingleChoiceItems(phoneNums, 0,new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog,int which) {
            // get selected item and close the dialog
            String selectedNumber = phoneNums[which];
            updateUserSelectedNumber(position , selectedNumber);
            removeDialog(DIALOG_REVIEW);
        }
    });
    return dialog.create();
}

если вы предпочитаете, вы можете установить onDismissListener и выполнить команду removeDialog в диалоговом окне dismiss.


2 / Довольно симпатичный

В методе onPrepareDialog просто замените старый ArrayAdapter, используемый диалогом, на новый:

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {
        case DIALOG_REVIEW:
            ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.select_dialog_singlechoice, android.R.id.text1, phoneNums);
            AlertDialog ad = (AlertDialog) dialog;
            ad.getListView().setAdapter(adapter);
        break;
        default:
            super.onPrepareDialog(id, dialog);
    }
}

Я использую тот же метод, который использовался android (AlertController.java L. 854 исходного кода froyo), чтобы заполнить диалоговое окно в первый раз.

...