#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 на своих спиннерах с новыми адаптерами. Я бы посоветовал сохранить адаптеры в виде полей в вашей активности после их создания, чтобы вы могли легко повторно использовать их, если вам нужно снова переключаться между адаптерами.