Android - ListView - performItemClick
Мне приходится сталкиваться с некоторыми трудностями, когда я пытаюсь использовать функцию performItemClick ListView.
Все, что я хочу сделать, - это щелкнуть программно в первом элементе списка.
Как я могу это сделать? Я просмотрел эту функцию в документации, но я не совсем понял ее параметры.
Я пробовал что-то вроде:
myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId());
Но это не сработало (myListView.getChildAt(0) returns null)
Заранее благодарю вас!
Ответы
Ответ 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();
}
}
}