Обновление динамического счетчика Android

Я работаю с Android и Spinners, и мне нужна помощь. У меня есть класс, который создает два счетчика и кнопку. Первый счетчик для моей категории, мой второй для моей подкатегории. То, что я пытаюсь сделать, это динамически обновлять второй счетчик (spinner2). Я пытался использовать adapter2.clear(), но это приводит к сбою Android с ошибкой «невозможно запустить неподдерживаемую операцию компонента активности».

Вот мой код:

public class MyClass extends MyBaseClass
{
    int category;
    int sub_category;
    ArrayAdapter<String> adapter2;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.quizes);

        //CATEGORY INFO
        final String[] items1 = new String[] {"One", "Two", "Three"};
        final Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, items1);
        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(adapter1);

        //SUBCATEGORY INFO
        final String[] items2 = new String[] {"SOne", "STwo", "SThree"};
        final Spinner spinner2 = (Spinner) findViewById(R.id.spinner2);
        adapter2 = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, items2);
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner2.setAdapter(adapter2);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.button1);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // do something when the button is clicked



                startActivity(new Intent(MyClass.this, GoToOtherClass.class));
              } 
        });


        //SELECTOR CONTROL FOR SPINNER1 {CATEGORY}
        spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                MyClass.this.category = spinner1.getSelectedItemPosition();

        //OTHER STUFF


            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });

        //SELECTOR CONTROL FOR SPINNER2 {SUB-CATEGORY}
        spinner2.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

                MyClass.this.sub_category = spinner2.getSelectedItemPosition();

        //OTHER STUFF

            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        return true;
    }
}

Я понимаю методы .clear()/.add(), но каждый раз, когда я пытаюсь очистить()/add(), моя программа дает сбой. Что мне нужно сделать, чтобы исправить ситуацию, чтобы я мог изменить содержимое spinner2 для своего суб- список категорий? Любой совет поможет, так как я часами занимался такими вещами, как:

Объект t=adapter2.getitem(0); spinner2.remove((String) t);

или adapter2.clear() и несколько других трюков, и у меня больше не осталось идей. Я все еще изучаю андроид. Я пытался просмотреть некоторые другие сообщения здесь, в stackoverflow и google, но не был уверен, как заставить их идеи работать.


person user591162    schedule 28.03.2011    source источник


Ответы (2)


После того, как вы измените содержимое второго Spinner, вам нужно вызвать adapter2.notifyDataSetChanged(). Без этого вызова пользовательский интерфейс не будет обновляться с новым содержимым Spinner, и у вас также могут возникнуть проблемы со ссылками на вещи, которых больше не существует.

person BigFwoosh    schedule 28.03.2011
comment
У меня все еще есть некоторые проблемы. В моем spinner1.setOnItemSelectedListener(new OnItemSelectedListener() { и внутри public void onItemSelected() я добавил adapter2.clear(); adapter2.add(TEST); adapter2.notifyDataSetChanged();, но все равно происходит сбой, что делать Мне нужно сделать, чтобы получить быстрый пример? - person user591162; 28.03.2011
comment
Я нашел проблему, мне пришлось заново создавать данные адаптера после использования notifyDataSetChanged(), спасибо за помощь! - person user591162; 28.03.2011

Попробуйте этот код..

public class MainActivity extends Activity {

Spinner sp1,sp2;
ArrayAdapter<String> adp1,adp2;
List<String> l1,l2;
int pos;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    l1=new ArrayList<String>();

    l1.add("A");
    l1.add("B");

    sp1= (Spinner) findViewById(R.id.spinner1);
    sp2= (Spinner) findViewById(R.id.spinner2);

    adp1=new ArrayAdapter<String> (this,android.R.layout.simple_dropdown_item_1line,l1);
    adp1.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    sp1.setAdapter(adp1);

    sp1.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            // TODO Auto-generated method stub
            pos=arg2;
            add();

        }

        private void add() {
            // TODO Auto-generated method stub
            Toast.makeText(getBaseContext(), ""+pos, Toast.LENGTH_SHORT).show();

            switch(pos)
            {
            case 0:
                l2= new ArrayList<String>();                    
                l2.add("A 1");
                l2.add("A 2");

                adp2=new ArrayAdapter<String>(MainActivity.this,
                        android.R.layout.simple_dropdown_item_1line,l2);
                adp2.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
                sp2.setAdapter(adp2);

                select();

                break;
            case 1:
                l2= new ArrayList<String>();                    
                l2.add("B 1");
                l2.add("B 2");

                adp2=new ArrayAdapter<String>(MainActivity.this,
                        android.R.layout.simple_dropdown_item_1line,l2);
                adp2.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
                sp2.setAdapter(adp2);

                select();

                break;
            }

        }

        private void select() {
            // TODO Auto-generated method stub

            sp2.setOnItemSelectedListener(new OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getBaseContext(), "Test "+arg2, Toast.LENGTH_SHORT).show();

                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
            });

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });
    }

}
person Balaji    schedule 07.08.2012