Страница 1 из 1

програмный вызов клика списка

Добавлено: 27 авг 2013, 20:02
Banhammer
есть ListView с кучей элементов
ну и на нём висит обработчик

Код: Выделить всё

public void onItemClick(AdapterView<?> arg0, View arg1,
					int songNumber, long arg3) {
Log.w("TAG","clicked");
				if(clickedView!=null)
					clickedView.setBackgroundColor(Color.BLACK);
				clickedView=arg1;
				clickedView.setBackgroundColor(Color.GRAY);}
при клике пальцем по элементам, всё великолепно и хорошо, получаю на вход в arg1 LinearLayout и меняю его цвет
НО
стоит сделать вот этот кусочек

Код: Выделить всё

lv.performItemClick(
			        lv.getAdapter().getView(number, null, null),
			        number,
			        lv.getAdapter().getItemId(number));
как начинается беспредел. как бы элемент кликается успешно, но цвет фона элемента не меняется. почему?
а при таком вызове меняется фон, но только самого listView

Код: Выделить всё

lv.performItemClick(lv, playing, lv.getItemIdAtPosition(number));
объясните пжст

Re: програмный вызов клика списка

Добавлено: 27 авг 2013, 22:23
Foenix
вызывать самостоятельно getView списка это ужасно, ужасно неправильно.

Re: програмный вызов клика списка

Добавлено: 28 авг 2013, 00:34
KamiSempai
Foenix писал(а):вызывать самостоятельно getView списка это ужасно, ужасно неправильно.
Тут нужно сказать почему.
Дело в том, что getView создает новую строку а не возвращает имеющуюся.

Следовательно, строки нужно брать из самого ListView.
Делается это при помощи метода getChildAt(int index).
Тут нужно учитывать смещение так как нулевой элемент - это верхний видимый элемент. Его позиция во всем списке получается при помощи метода getFirstVisiblePosition().
Однако, стоит учитывать, что в этом случае можно сделать клик только по видимому элементу.
Вот пример как это реализуется:

Код: Выделить всё

private void performListItemClick(int position) {
	//Нужно проверить не выходит ли указанная позиция за пределы видимости
	if(position >= lv.getFirstVisiblePosition() && position <= getLastVisiblePosition()) {
		lv.performItemClick(lv.getChildAt(position - lv.getFirstVisiblePosition()), position, lv.getItemIdAtPosition(position));
	}
	else {
		//Если делать нажатие по невидимому элементу, то в обработчике нужно учесть, что переданный view может быть null.
		lv.performItemClick(null, position, lv.getItemIdAtPosition(position));
	}
}