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

Интерфейс, диалоги, темы, стили, меню
Ответить
Banhammer
Сообщения: 32
Зарегистрирован: 24 июн 2013, 17:09

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

Сообщение Banhammer » 27 авг 2013, 20:02

есть 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));
объясните пжст

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 27 авг 2013, 22:23

вызывать самостоятельно getView списка это ужасно, ужасно неправильно.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 28 авг 2013, 00:34

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));
	}
}
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить