Android - ListView - executeItemClick - PullRequest
40 голосов
/ 11 ноября 2011

Я сталкиваюсь с некоторыми трудностями, когда пытаюсь использовать функцию executeItemClick ListView.

Все, что я хочу сделать, это программно выполнить щелчок в первом элементесписок.

Как я могу это сделать?Я посмотрел эту функцию в документации, но я не совсем понял ее параметры.

Я попробовал что-то вроде:

 myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId());

Но это не сработало (myListView.getChildAt(0) returns null)

Заранее спасибо!

Ответы [ 22 ]

63 голосов
/ 29 апреля 2013
mList.performItemClick(
        mList.getAdapter().getView(mActivePosition, null, null),
        mActivePosition,
        mList.getAdapter().getItemId(mActivePosition));

Где mActivePosition - ваша позиция клика!Всего наилучшего!:)

26 голосов
/ 04 февраля 2012

Это сработало для меня.

listView.performItemClick(
    listView.getAdapter().getView(position, null, null), position, position);

используйте адаптер, чтобы получить представление о положении предмета. Остальные 2 параметра мне не нужны, поэтому я оставил их пустыми. Если оставить convertView null, адаптер будет отображать новое представление. Это проблема производительности, но так как это происходит только время от времени, это не будет иметь большого эффекта. Мне не нужно указывать родителя для чего-либо, потому что я им не пользуюсь.

Позиция - это просто место, где находится ваш предмет. Кроме того, эти 2 строки кода перед тем, как ваш executeItemClick создает иллюзию выбора элемента списка. Они также гарантируют, что соответствующий элемент находится на экране.

listView.requestFocusFromTouch();
listView.setSelection(position);
14 голосов
/ 13 июня 2013

Это работает лучше всего для меня. Запустите это в главном потоке.

new Handler().post(new Runnable() {
    @Override
    public void run() {
        mList.performItemClick(
                mList.getChildAt(mActivePosition),
                mActivePosition,
                mList.getAdapter().getItemId(mActivePosition));
    }
});

Это похоже на ответ Аруна Хосе, но оно помещает в очередь сообщение для основного потока, чтобы дать ListView некоторое время для инициации.

6 голосов
/ 25 января 2012

Я попробовал код ниже, и он работал.

getListView().performItemClick(null, 0, getListAdapter().getItemId(0));

Первый параметр (представление) может быть нулевым.

5 голосов
/ 02 января 2013

Я пошел с

listView.getAdapter().getView(position, null, null).performClick();
2 голосов
/ 28 мая 2015
mList.performItemClick(
    mList.getChildAt(mActivePosition),
    mActivePosition,
    mList.getAdapter().getItemId(mActivePosition));

, где mActivePosition - позиция дочернего представления в представлении списка.

1 голос
/ 04 апреля 2014

Сначала я попытался использовать этот код в своем фрагменте (Master / Detail -> NameListFragment)

getListView().performItemClick(null, 0, getListView().getAdapter().getItemId(0));

Но это не сработало. Когда я сделал @Override onStart() метод во фрагменте, и я переместил свой код в onStart(). После этого у меня все работает нормально.

1 голос
/ 27 июня 2013

Используя предложенный код @sulal, вы можете поместить его в onLoadFinished, если вы используете LoaderManager.Например, что-то вроде

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    //....
    // mSelectedId keeps the currently selected id
    // INVID is an invalid value
    if (mSelectedId == INVID) { // nothing selected
        // sulal's code
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                mList.performItemClick(
                        mList.getChildAt(mActivePosition),
                        mActivePosition,
                        mList.getAdapter().getItemId(mActivePosition));
                mSelectedId = mList.getAdapter().getItemId(mActivePosition);
            }
        });            
    }

mActivePosition может быть 0 (т. Е. Позиция на первом элементе) или позиция, сохраняемая в течение, например, onPause

1 голос
/ 09 апреля 2014

Я работал с executeItemClick, и он работал для меня, но с небольшой проблемой.я пытался покрасить фон нажатого элемента, но он никогда не работал, просто обратите внимание, что если вы передадите convert view как null (второй параметр), а затем попытаетесь что-то сделать с помощью OnClick (), это не изменится из-за метода getView ()Адаптера даст вам другой Просмотр объекта.вам нужно манипулировать методом getView () вашего адаптера, чтобы перехватить View, чтобы вы могли использовать qork.

1 голос
/ 27 мая 2014

Если вы работаете над модульным тестом.Попробуйте использовать getInstrumentation (). WaitForIdleSync (), чтобы дождаться загрузки списка и расширить ActivityInstrumentationTestCase2. См. Этот ответ .

...