Как динамически поменять список в компоненте Spinner?

Рейтинг: 0Ответов: 1Опубликовано: 07.04.2015

Есть два компонента Spinner. В зависимости от выбора пункта в первом, должен поменяться список во втором. Т.е. я динамически создам массив String[] strArr2 зависящий от выбора в первом Spinner. Создаю вот так:

ArrayAdapter<String> adapter_spin1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, name_alb);
    adapter_spin1.setDropDownViewResource(R.layout.spiner);
    Spinner spinner1Forms = (Spinner) findViewById(R.id.spin1);
    spinner1Forms.setAdapter(adapter_spin1);
    spinner1Forms.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            //Log.d(LOG_TAG,"id="+id+" pos="+pos);
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            //Log.d(LOG_TAG,"Nothing");
        }
    });

    ArrayAdapter<String> adapter_spin2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, strArr2);
    adapter_spin2.setDropDownViewResource(R.layout.spiner);
    Spinner spinner1Forms2 = (Spinner) findViewById(R.id.spin2);
    spinner1Forms2.setAdapter(adapter_spin2);
    spinner1Forms2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            //Log.d(LOG_TAG,"id="+id+" pos="+pos);
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            //Log.d(LOG_TAG,"Nothing");
        }
    });

И куда надо вставить строку для обновления списка?

adapter_spin1.notifyDataSetChanged();

может есть более простой вариант?

Ответы

▲ 2

Ну по идее его нужно поставить в onItemSelected у первого спиннера. И это будет скорее всего adapter_spin2.notifyDataSetChanged(); у вас же менятся содержимое 2ого спиннера т.е. это может быть как то так

spinner1Forms.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            strArr2.add("Smth more");
            adapter_spin2.notifyDataSetChanged();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            //Log.d(LOG_TAG,"Nothing");
        }
    });


private class SelectedListener implemets AdapterView.OnItemSelectedListener {
           private ArrayAdapter<String> adapter;
           private ArrayList<String> arr;
           public SelectedListener(ArrayAdapter<String> adapter, ArrayList<String> arr) {
                this.adapter = adapter;
                this.arr = arr;
            }
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                arr.add("Smth more");
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                //Log.d(LOG_TAG,"Nothing");
            }
}
spinner1Forms.setOnItemSelectedListener(new SelectedListener(apapter_spin2, strArr2));

Я только не уверен что это будет нормально работать, нужно протестировать.

Только тут нужно будет немного попроавить, что бы в колбеке были видны и адапетр для 2ого спинера и массив.