Как мне изменить, какой массив строк использует мой счетчик?

#android #spinner #android-arrayadapter

#Android #счетчик #android-arrayadapter

Вопрос:

Я пытаюсь изменить содержимое моих двух спиннеров. Итак, я создал свои блесны:

        Spinner spinner01 = (Spinner) findViewById(R.id.Spinner01);
    Spinner spinner02 = (Spinner) findViewById(R.id.Spinner02);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.MetricUnitsArray, android.R.layout.simple_spinner_item);
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
            this, R.array.MetricUnitsArray, android.R.layout.simple_spinner_item);


    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinner01.setAdapter(adapter1);
    spinner02.setAdapter(adapter2);

    spinner01.setOnItemSelectedListener(new MyOnItemSelectedListener1());
    spinner02.setOnItemSelectedListener(new MyOnItemSelectedListener2());
  

Теперь с помощью другого метода я хочу иметь возможность делать что-то вроде этого:

     adapter1 = ArrayAdapter.createFromResource(
            this, R.array.ImperialUnitsArray, android.R.layout.simple_spinner_item);
    adapter2 = ArrayAdapter.createFromResource(
            this, R.array.ImperialUnitsArray, android.R.layout.simple_spinner_item);
  

Есть ли способ заставить адаптеры читать из другого массива строк? Или я должен заменить значения в массиве строк новыми?

Ответ №1:

Создайте отдельные адаптеры для каждого массива, который вы хотите назначить spinner2. Объявите их как окончательные. Разместите объявления адаптера перед установкой прослушивателя spinner1 ItemSelected. В прослушивателе spinner1 ItemSelected установите соответствующий адаптер по мере необходимости.

В приведенном ниже коде у меня есть два спиннера. В spinner1 есть 4 записи, содержащие типы датчиков, когда выбирается один из типов датчиков, spinner2 затем заполняется различными моделями для этого типа датчика.

 public class MainActivity extends Activity {

void showToast(CharSequence msg) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

   final Spinner s1 = (Spinner) findViewById(R.id.spinner_sensor_type);
   final Spinner s2 = (Spinner) findViewById(R.id.spinner_sensor_model);
   final ArrayAdapter<CharSequence> sensor_adapter = ArrayAdapter.createFromResource(
            this, R.array.sensors,android.R.layout.simple_spinner_item);
    sensor_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    final ArrayAdapter<CharSequence> pa_adapter = ArrayAdapter.createFromResource(
            this, R.array.pa_models,android.R.layout.simple_spinner_item);
    final ArrayAdapter<CharSequence> ca_adapter = ArrayAdapter.createFromResource(
            this, R.array.ca_models,android.R.layout.simple_spinner_item);
    final ArrayAdapter<CharSequence> ni_adapter = ArrayAdapter.createFromResource(
            this, R.array.ni_models,android.R.layout.simple_spinner_item);
    final ArrayAdapter<CharSequence> ni_fe_adapter = ArrayAdapter.createFromResource(
            this, R.array.ni_fe_models,android.R.layout.simple_spinner_item);
    pa_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ca_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ni_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ni_fe_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(sensor_adapter); 
    s2.setAdapter(pa_adapter); // set default array values in spinner 2 
    s1.setOnItemSelectedListener(
            new OnItemSelectedListener() {
                public void onItemSelected(
                        AdapterView<?> parent, View view, int position, long id) {
                    showToast("Sensor Type: position="   position   " id="   id);
                    switch (position) {
                    case 0: 
                        s2.setAdapter(pa_adapter);                          
                            break;
                    case 1: 
                        s2.setAdapter(ca_adapter);
                            break;
                    case 2:
                        s2.setAdapter(ni_adapter);
                            break;
                    case 3:
                        s2.setAdapter(ni_fe_adapter);
                    default: // Do this...
                            break;
               }  

                }

                public void onNothingSelected(AdapterView<?> parent) {
                    showToast("Sensor Type: unselected");
                }
            });



    s2.setOnItemSelectedListener(
            new OnItemSelectedListener() {
                public void onItemSelected(
                        AdapterView<?> parent, View view, int position, long id) {
                    showToast("Sensor Model: position="   position   " id="   id);
                }

                public void onNothingSelected(AdapterView<?> parent) {
                    showToast("Sensor Model: unselected");
                }
            });
}
  

}

Ответ №2:

Вы можете использовать ArrayAdapter методы получения / установки:

Например:

 adapter1.clear();
adapter1.addAll(theNewListOfValues);
adapter1.notifyDatasetChanged();
  

Комментарии:

1. Потрясающе, спасибо. Очевидно, что я новичок в этом, поэтому у меня все еще возникают проблемы. Я пытаюсь использовать adapter1.clear() другой метод, но adapter1 не может быть разрешен. В других случаях я мог сделать переменные общедоступными и просто как бы сидеть в классе. В этом случае я получаю проблемы с принудительным закрытием, если я не инициализирую адаптеры в методе onCreate. Есть ли способ получить доступ к адаптеру из другого метода в том же классе?

2. Бах, я такой тупой. Я неправильно инициализировал адаптер. Еще раз спасибо.

Ответ №3:

Вы должны иметь возможность просто вызывать setAdapter на своих спиннерах с новыми адаптерами. Я бы посоветовал сохранить адаптеры в виде полей в вашей активности после их создания, чтобы вы могли легко повторно использовать их, если вам нужно снова переключаться между адаптерами.