Android showDropDown onCreate не работает


Таким образом, у меня есть представление автозаполнения, которое показывает выпадающее меню, когда я печатаю... Но я хочу, чтобы выпадающий список был показан, когда начнется avtivity. Поэтому я нашел этотОтвет , который говорит, что использование showDropDown() должно работать. И это действительно работает в моем случае, когда вызывается любой TouchListener или любое другое событие, вызванное пользователем. Но это не работает, если я просто использую его в onCreate()... Следующий код в my onCreate () работает

    final AutoCompleteTextView actv = (AutoCompleteTextView)findViewById(R.id.autoCompleteUserName);
    String[] users = getResources().getStringArray(R.array.users);
    ArrayAdapter<?> adapter = new ArrayAdapter<Object>(this,R.layout.compose_ac_list_item,users);
    actv.setAdapter(adapter);

    actv.setOnTouchListener(new View.OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // WORKS IF USED ON TOUCH
            actv.showDropDown();
              return false;
        }
    });

И следующее не работает

    final AutoCompleteTextView actv = (AutoCompleteTextView)findViewById(R.id.autoCompleteUserName);
    String[] users = getResources().getStringArray(R.array.users);
    ArrayAdapter<?> adapter = new ArrayAdapter<Object>(this,R.layout.compose_ac_list_item,users);
    actv.setAdapter(adapter);

    actv.showDropDown();
1 3

1 ответ:

Потому что при вызове setAdapter требуется некоторое время, чтобы раздуть все элементы списка. В течение этого времени, если вы вызовете showDropDown(), listview еще не раздулся, поэтому он не сможет показать выпадающее меню. Вы могли бы дать некоторую задержку перед вызовом showDropDown(). Но я не уверен, что это эффективное решение, поскольку мы не будем точно знать, сколько времени потребуется, чтобы раздуть пункты списка.

    actv.setAdapter(adapter);
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            actv.showDropDown();
        }
    }, 500);