Как изменить элементы, перечисленные в AlertDialog?

В моем приложении пользователь может добавлять новые города. Это должно происходить следующим образом:

  1. Нажимает кнопку «добавить город» в меню.
  2. Выбирает провинцию из появившегося списка (AlertDialog).
  3. Выбирает город из списка, созданного на основе выбранной провинции.

Диалог провинции всегда будет одинаковым, поэтому я сделал диалог города отдельным диалогом. Проблема в том, что, поскольку onCreateDialog() вызывается только при первом добавлении города, я не могу понять, как настроить этот список в зависимости от выбранной провинции. addItems() — это метод AlertDialog.builder, который, насколько я могу судить, не очень полезен для меня в onPrepareDialog.

Как изменить список элементов в диалоговом окне при каждом его вызове (и соответственно обновить onClickListener?

Изменить: я добавил код, который у меня есть до сих пор. В моей текущей реализации есть две основные проблемы:

  1. Диалоговое окно города (SelectLocationDialog) выглядит совершенно иначе, чем диалоговое окно провинции. Я не могу понять, как заставить их выглядеть одинаково (сейчас я использую android.R.layout.simple_list_item_1 для диалога города).
  2. Для диалога города нет onClickListener, так что на самом деле он ничего не делает.

    @Override
    protected Dialog onCreateDialog(int id, Bundle args) {
        AlertDialog.Builder builder = null;
    
        switch (id) {
    
            case DIALOG_SELECT_PROVINCE:
                return SelectProvinceDialog.create(this);
    
            case DIALOG_SELECT_LOCATION:
                return SelectLocationDialog.create(this);
    
            default:
                return null;
        }
    }
    
    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
    
        switch (id) {
    
            case DIALOG_SELECT_LOCATION:
                // looks up all cities/sites in the province selected in the
                // previous dialog
                siteList = new XmlSiteListReader(this);
                siteList.findSitesByProvince(Province.valueOf(
                        Province.getAbbreviatedName(selectedProvince)));
                String[] sites = siteList.siteNames();
    
                ListView siteListView = new ListView(this);
                ArrayAdapter<CharSequence> siteListAdapter = 
                        new ArrayAdapter<CharSequence>(this, 
                        android.R.layout.simple_list_item_1, sites);
                siteListView.setAdapter(siteListAdapter);
                dialog.setContentView(siteListView);
        }
    }
    
    
    
    /**
     * A dialog that allows the user to select a province/region from which to add
     * locations to watch.
     * 
     * @author Dean Morin
     */
    public class SelectProvinceDialog {
    
        private static final String[] PROVINCES;
        static {
            PROVINCES = new String[Province.values().length];
            Province[] provinces = Province.values();
            for (int i = 0; i < provinces.length; i++) {
                PROVINCES[i] = provinces[i].getFullName();
            }
        }
    
        /**
         * Creates the 'Select Province' dialog window.
         * 
         * @param context The context for this dialog.
         * @return The constructed dialog.
         */
        public static AlertDialog create(final Context context) {
            AlertDialog.Builder selectProv = new AlertDialog.Builder(context);
            selectProv.setTitle("Select Province");
            selectProv.setItems(PROVINCES, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                    ((WeatherWatch) context).setSelectedProvince(PROVINCES[item]);
                    ((Activity) context)
                            .showDialog(WeatherWatch.DIALOG_SELECT_LOCATION, null);
                }
            });
            return selectProv.create();
        }
    }
    
    
    public class SelectLocationDialog {
    
        /**
         * Creates the 'Select Location' dialog window.
         * 
         * @param context The context for this dialog.
         * @return The constructed dialog.
         */
        public static AlertDialog create(final Context context) {
            AlertDialog.Builder selectLoc = new AlertDialog.Builder(context);
            return selectLoc.create();
        }    
    }
    

person Dean    schedule 15.09.2011    source источник


Ответы (1)


onPrepareDialog — это место, где вы сможете изменить значения списка. Я делал что-то подобное раньше. Опубликуйте свой код, если вам нужна помощь в его написании.

person C0deAttack    schedule 15.09.2011
comment
Я добавил то, что у меня есть до сих пор, а также 2 причины, почему это не работает. - person Dean; 15.09.2011