Android - ListView - executeItemClick

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

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

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

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

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

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

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

22 ответа

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

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

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

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

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

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

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

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

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

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

Я пошел с

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

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

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

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

При использовании 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 только вы должны вызывать выполнить щелчок. Иначе это будет не правильно.

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

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

Это работает для меня Если вы получите странный результат при использовании 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);

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

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

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

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

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

Попробуй это:

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;
    }

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

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

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

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

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

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

Просто следует использовать performItemClick() и это нормально.

listView.performItemClick(listView.getAdapter().getView(listView.getSelectedItemId, null, null), listView.getSelectedItemId, listView.getAdapter().getItemId(listView.getSelectedItemId));

myListView.getChildAt(0) возвращает null, потому что очень скоро используется.

используйте для этого задержку.

или используйте код ниже:

private class MyAdapter extends BaseAdapter
{
private final Context context;
private HashMap<Integer, View> views;

public MyAdapter(Context context)
{
    this.context = context;
    views = new HashMap<>();
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    if(convertView == null)
    {
        if(views.get(position) == null)
        {
            final LayoutInflater layoutInflater = LayoutInflater.from(context);
            convertView = layoutInflater.inflate(R.layout.my_grid, null, false);

            views.put(position, convertView);
        }
        else
            convertView = views.get(position);
    }

    TextView tv = convertView.findViewById(R.id.langView);
    tv.setText(languageList.get(position));

    return convertView;
}
}

а также

adapter = new MyAdapter(getActivity());
myListView.setAdapter(adapter);

Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        myListView.performItemClick(adapter.getView(position, null, myListView), position, 0);
    }
};

myListView.postDelayed(r, 100);

В моем случае ни один из вариантов не решил мою проблему, поэтому я сделал адаптацию в своем классе CursorAdapter. Я определил глобальную переменную в области видимости, поэтому я просто вызываю класс, изменяя это значение, и проверяю позицию курсора, передавая значение позиции

 mProductsAdapter.currentPosition = requiredPosition

в моем конструкторе продуктов

  var currentPosition = 0

в bindView я проверяю

 if (cursor.position == currentPosition) {
// perform action
}

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

listview.getSelectedView().performClick();

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

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

Отбрасывание некоторого опыта.

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

Hope It helps  

ExecuteClick, вероятно, вызывается до того, как listview был заполнен, поместите точку останова в getView и на executeItemClick и проверьте, что вызывается первым

getListView().performItemClick(null, 0, 0) сделал трюк для меня (для позиции 0).

Если бы вы получили странный результат при использовании 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);

Это из "Начинающих игр для 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();
    }
}

}

Другие вопросы по тегам