Подтвердить что ты не робот

Android - ListView - performItemClick

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

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

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

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

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

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

Заранее благодарю вас!

4b9b3361

Ответ 1

mList.performItemClick(
        mList.getAdapter().getView(mActivePosition, null, null),
        mActivePosition,
        mList.getAdapter().getItemId(mActivePosition));

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

Ответ 2

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

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

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

Позиция

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

listView.requestFocusFromTouch();
listView.setSelection(position);

Ответ 3

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

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

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

Ответ 4

Я пошел с

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

Ответ 5

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

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

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

Ответ 6

mList.performItemClick(
    mList.getChildAt(mActivePosition),
    mActivePosition,
    mList.getAdapter().getItemId(mActivePosition));

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

Ответ 7

Используя предложенный код @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 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

Ответ 8

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

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

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

Ответ 9

Я работал с performItemClick, и он работал у меня, но с небольшой проблемой. Я попытался покрасить фон нажатого элемента, но он никогда не работал, просто заметите, что если вы передадите преобразование в виде NULL (второй параметр), а затем попытаетесь что-то сделать в OnClick(), это не приведет к эффекту beacuse, метод getView() адаптера даст вам отличный объект View. вам нужно манипулировать методом getView() вашего адаптера, чтобы поймать View, чтобы вы могли его активировать.

Ответ 10

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

Ответ 11

Я просто встречаюсь с этой проблемой урода сегодня, и я стараюсь изо всех сил разобраться с этим.  Мое условие, когда я сначала начинаю макет, мне нужно сделать какой-то элемент отмеченным.   Но когда я использую gridView.getChildAt(position), всегда возвращаю null. Я встретил эту проблему раньше, вызванную Не заканчивая чертежной макет. Поэтому я отправляю сообщение. handler.postDelayed(..,..), It works. Спасибо, кто движет этим Исключением.

Ответ 12

это может быть старым, но это может помочь:

lvList.performItemClick(null, index, lvList.getItemIdAtPosition(index) ); 

ПРИМЕЧАНИЕ: первый параметр равен null и все равно будет работать, если у вас есть пользовательский адаптер, convertView будет заполнен пользовательским макетом и видом и т.д.

- чеки/счастливые кодировки.

Ответ 13

Эта работа для меня Если вы получите странный результат при использовании getView, это связано с тем, что элемент списка, который вы хотите, не существует в видимых частях. Используйте ниже:

private View getViewFromAdapterByPosition(int position, ListView listView) 
{
        View view;
        int firstVisiblePos = listView.getFirstVisiblePosition();
        int lastVisiblePos = listView.getLastVisiblePosition();

        if (position < firstVisiblePos || position > lastVisiblePos) {
            view = listView.getAdapter().getView(position, null, listView);
        } else {
            view = listView.getChildAt(position - firstVisiblePos);
        }
        return view;
    }

И затем,

listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0);

Ответ 14

При использовании Listview (простой адаптер массива или пользовательский адаптер) определите listview, а другие, наконец, выполните щелчок.

Например:

 //At onCreate function:

lv = (ListView) findViewById(R.id.listView);
        lv.setAdapter(new CustomAdapter(List_item.this, list, images));


lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)    {
// on click function works
    }
}


int position = 0;
lv.performItemClick(lv.getAdapter().getView(position, null, null), position, lv.getAdapter().getItemId(position));

Примечание. После создания setOnItemClickListener вы должны позвонить выполнить клик. В противном случае это будет неправильно.

Ответ 15

Попробуйте следующее:

public static boolean performClicKOnLisViewFromIndex(ListView listView, int index){
        if(listView != null){
            if(listView.getAdapter()!= null && listView.getAdapter().getCount() >0 && listView.getAdapter().getCount() > index ){
                listView.performItemClick(
                        listView.getAdapter().getView(index, null, null),
                        index, listView.getItemIdAtPosition(index));
                return true;
            }
        }
        return  false;
    }

Ответ 16

Вероятно, вызывается функция executeClick перед заполнением списка, помещением точки останова в getView и на performItemClick и проверкой, которую вызывается первым

Ответ 17

getListView().performItemClick(null, 0, 0) помогло (для позиции 0).

Ответ 18

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

listView.getAdapter().getView(1, null, null).performClick();

Ответ 19

Снижение опыта.

используя listview1.performItemClick, также запускает ваш listview1.OnItemClickListener, если вы используете слушателя с тем же списком в вашем коде.

Hope It helps  

Ответ 20

Если при использовании getView вы получите странный результат, это связано с тем, что элемент списка, который вы хотите, не существует в видимых частях. Используйте ниже:

private View getViewFromAdapterByPosition(int position, ListView listView) 
{
        View view;
        int firstVisiblePos = listView.getFirstVisiblePosition();
        int lastVisiblePos = listView.getLastVisiblePosition();

        if (position < firstVisiblePos || position > lastVisiblePos) {
            view = listView.getAdapter().getView(position, null, listView);
        } else {
            view = listView.getChildAt(position - firstVisiblePos);
        }
        return view;
    }

И затем,

listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0);

Ответ 21

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

listview.getSelectedView().performClick();

Ответ 22

Это от начала Android-игр. Он создает простой список элементов, которые вы можете щелкнуть, чтобы открыть новое действие. Разумеется, каждый элемент списка должен быть добавлен в AndroidManifest.xml как отдельное действие с именем .ListItem #.

public class MainActivity extends ListActivity {
String tests[] = { "ListItem1",
                   "ListItem2",
                   "ListItem3",
                   "ListItem4"};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tests));
}

@Override
protected void onListItemClick(ListView list, View view, int position, long id) {
    super.onListItemClick(list, view, position, id);
    String testName = tests[position];

    try {
        Class<?> classInstance = Class.forName("your.package.name." + testName);
        Intent intent = new Intent(this, classInstance);
        startActivity(intent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

}