Как актуализировать значения элементов setMultiChoiceItems в onPrepareDialog? - PullRequest
7 голосов
/ 13 февраля 2011

Я показываю диалог с флажками (список извлекается из БД), чтобы позволить пользователю выбирать, какие строки удалять. Поскольку кеширование диалогов 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();

Как обновить значения (элементы, _selections) в onPrepareDialog? Я пытался сделать недействительными представления, надеясь, что это заставит android загружать элементы еще раз (не работает), но я думаю, что это плохой выбор, а также удаление диалога и воссоздание.

protected void onPrepareDialog(final int id, final Dialog dialog) {
          switch (id) {
          case REMOVE_DIALOG_ID:

              ListView lv = ((AlertDialog) dialog).getListView();
                lv.invalidateViews();

          break;
          }

Спасибо за любые идеи!

Ответы [ 4 ]

6 голосов
/ 24 марта 2011

Когда вы создаете список элементов, используя AlertDialog.Builder, он внутренне берет это и создает ListAdapater, который зависит от типа данных, которые вы передали.Поскольку "элементы" в вашем примере не похожи на идентификатор ресурса, я предполагаю, что это либо CharSequence [], либо Cursor.Если вы предоставите больше информации о том, что такое «элементы», я могу привести более конкретный пример.

  • Для данных CharSequence[] (например, String []) Builder создает экземпляр ArrayAdapter.
  • Для данных Cursor, Builder создает CursorAdapter

Вам необходимо получить ссылку на этот ListAdapter, используя getListView().getAdapter() в экземпляре AlertDialog.

Для курсора вы можете избежать вызова notifyDataSetChanged() после вызова requery() для обновления набора данных.

Поскольку вы не можете «обновить» массив новыми данными (изменение указателя)для нового экземпляра это не то же самое ... экземпляр, на который указывает адаптер, остается неизменным), в этом случае немного больше работы.Вам потребуется вызвать методы адаптера add(), clear() и т. Д., Чтобы удалить недопустимые элементы и добавить обновления.Теперь, когда набор данных адаптеров полностью обновлен, вы можете позвонить notifyDataSetChanged().

Надеюсь, что поможет!

2 голосов
/ 29 марта 2011

Я потратил много времени на поиск того же решения и, в конце концов, исправил свою проблему с помощью простых вещей после попытки использовать onPrepareDialog

Я использую функцию removeDialog (int) в Activity. Когда диалог закрывается, Activity в основном сохраняет состояние диалога (по причинам производительности, которые я мог бы себе представить). Вызов removeDialog (int) в диалоговом окне вынуждает действие выгружать все ссылки для диалогового окна и удаляет его с экрана, если оно отображается.

сделал это, когда моя деятельность потеряла фокус, просто добавьте:

 public void onStop() {
            removeDialog(Id_Dial);
            return;
        }
1 голос
/ 18 октября 2011

Моя техника - создать адаптер с пустыми данными в 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;
        }
}
0 голосов
/ 14 февраля 2011

В вашем методе onPrepareDialog вместо использования invalidateViews () вы должны попытаться получить адаптер ListView и вызвать либо notifyDataSetChanged (), либо notifyDataSetInvalidated (). Это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...