Урок 44. События в ListView

Обсуждение уроков
Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 44. События в ListView

Сообщение dens » 04 фев 2013, 01:30

В общем, я покопался, дело в кнопке. Не знаю почему, но он как-то перехватывает нажатия и мешает слушателю элемнтов списка. Если вместо кнопки ставить TextView или совсем её убирать, то всё начинает работать как надо.

dcbp
Сообщения: 24
Зарегистрирован: 26 ноя 2012, 10:34

Re: Урок 44. События в ListView

Сообщение dcbp » 06 фев 2013, 12:44

Спасибо за ответ!
Я так и не понял, почему если ставить кнопочку не работает( Буду рыть дальше, может найду чего!
Если кто столкнётся напишите объяснение плиз)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 44. События в ListView

Сообщение rezak90 » 06 фев 2013, 19:29

чего не понятного, если существуют одинаковые события у ребёнка и родителя, то перехватываться они будут родителем, до ребёнка не дойдёт, вот такая дедовщина =)
R.id.team
Политика на форуме запрещена

dcbp
Сообщения: 24
Зарегистрирован: 26 ноя 2012, 10:34

Re: Урок 44. События в ListView

Сообщение dcbp » 06 фев 2013, 19:46

А почему тогда такое же событие на ImageView отрабатывает нормально?
И кстати почему кнопочка это родитель, а сам элемент списка потомок?

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 44. События в ListView

Сообщение dens » 06 фев 2013, 20:01

Да. Я бы понял, если бы ListItem перехватывал события кнопки. А тут наоборот кнопка не даёт элементу списка обработать нажатие.

grecd
Сообщения: 19
Зарегистрирован: 08 мар 2013, 14:36

Re: Урок 44. События в ListView

Сообщение grecd » 13 апр 2013, 13:12

Заметил странный глюк eсlipse : убирает старые импорты такие как интент заменяя новыми при ctrl+shift+o.
короче пришлось копипастить из примера урока импорты без автоподставновки

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 44. События в ListView

Сообщение igrok-vip » 06 май 2013, 14:21

По уроку "OnItemClickListener – обрабатывает нажатие на пункт списка. Предоставляет нам метод onItemClick(AdapterView<?> parent, View view, int position, long id)"
Скажите, как мне в listview при заполнении данными вложить к каждому item свой id, который я смог бы прочитать в onItemClick?
У меня listview заполняется из базы данных и при нажатии пункта нужно знать именно id.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 44. События в ListView

Сообщение rezak90 » 06 май 2013, 14:46

igrok-vip писал(а):По уроку "OnItemClickListener – обрабатывает нажатие на пункт списка. Предоставляет нам метод onItemClick(AdapterView<?> parent, View view, int position, long id)"
Скажите, как мне в listview при заполнении данными вложить к каждому item свой id, который я смог бы прочитать в onItemClick?
У меня listview заполняется из базы данных и при нажатии пункта нужно знать именно id.
long id - это и есть id из бд
R.id.team
Политика на форуме запрещена

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 44. События в ListView

Сообщение igrok-vip » 06 май 2013, 15:00

Это я понял, но как их туда положить при заполнении адаптера? Ведь мы туда передаём только массив данных(список данных) и layout для item'a. А как передать ещё и id?

А, всё, понял. Там несколько конструкторов для адаптера)

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 44. События в ListView

Сообщение igrok-vip » 06 май 2013, 15:24

Блин не понял таки) Скажите какой конструктор выбирать и в каком виде туда передать id шки? Сейчас они у меня в ArrayList. Или всё-таки как-то по другому?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 44. События в ListView

Сообщение rezak90 » 06 май 2013, 17:54

igrok-vip писал(а):Блин не понял таки) Скажите какой конструктор выбирать и в каком виде туда передать id шки? Сейчас они у меня в ArrayList. Или всё-таки как-то по другому?
для работы с базой и отображения её в листе лучше использовать simplecursoradapter, тогда и id будет автоматом подстраиваться
R.id.team
Политика на форуме запрещена

Анна Антонова
Сообщения: 7
Зарегистрирован: 16 июн 2013, 16:02

Re: Урок 44. События в ListView

Сообщение Анна Антонова » 16 июн 2013, 16:28

Здравствуйте!

Осваиваю Андроид, попутно пишу рабочее приложение. Встала проблема, которую как-то удалось решить, но не уверена, что найденное решение оптимально. Прошу помощи у зала - посоветуйте, подскажите, если есть более разумные способы решить задачу.

Итак, задача:
Android 2.3.3. MainActivity (TabActivity) + энное количество вкладок, на каждой из которых есть кнопки и свой ListView с кастомным адаптером (от BaseAdapter) и большим количеством элементов с чекбоксами. Поскольку кнопки должны отрабатывать действия по всем выделенным элементам списка, даже скрытым, пришлось создавать View для каждого элемента каждого списка.

Нужно реализовать реакцию по кликам на элементах списка. Для разных списков это будет вызов разных Activity (описание элементов в разных форматах). Но Слушатель для элементов списка отключается при наличии в слое кнопок - конфликтует со слушателями кнопок. Пробовала назначать слушателя кнопкам через наследование интерфейса, через создание в Activity, через onClick в XML - не работает. Убираешь кнопки - все отлично.

Удалось выкрутиться правкой биндера списка, код ниже (пока с единым слушателем для всех списков). Но при этом мало того, что для всех позиций создается куча вьюшек, так еще и появляется куча одинаковых объектов слушателей - по одному на каждый элемент каждого списка.

Подозреваю, что при больших списках (пока тестирую на паре десятков позиций, но будут сотни) приложение будет жрать память и сильно тормозить. Так ли это? И если да - как выкрутиться?

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		view = lInflater.inflate(R.layout.item_check, parent, false);

		final Story itemStory = getStory(position);

		((TextView) view.findViewById(R.id.tvName)).setText(itemStory.getName());
		((TextView) view.findViewById(R.id.tvDate)).setText(itemStory.getDate());
		
		CheckBox cbCheck = (CheckBox) view.findViewById(R.id.chkStory);
		cbCheck.setOnCheckedChangeListener(myCheckChangList);
		cbCheck.setTag(position);
		cbCheck.setChecked(itemStory.isChecked());
		if (itemStory.isDownloaded()) cbCheck.setEnabled(false);
		
		view.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(ctx, PreviewActivity.class);
				intent.putExtra("name", itemStory.getName());
				intent.putExtra("date", itemStory.getDate());
				intent.putExtra("annotation", itemStory.getAnnotation());
				ctx.startActivity(intent);
			}
		});
			
		return view;
	}

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 44. События в ListView

Сообщение rezak90 » 16 июн 2013, 22:33

Так ли это?
нет)
R.id.team
Политика на форуме запрещена

Анна Антонова
Сообщения: 7
Зарегистрирован: 16 июн 2013, 16:02

Re: Урок 44. События в ListView

Сообщение Анна Антонова » 17 июн 2013, 09:50

rezak90 писал(а):
Так ли это?
нет)
Хм... Это как-то не согласуется с моими (порядком устаревшими, впрочем) представлениями о распределении памяти в ООП.

Т.е. вполне себе нормальное решение?

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

Re: Урок 44. События в ListView

Сообщение Foenix » 17 июн 2013, 11:00

Анна, а причем здесь ООП? вы же про списки сказали? у них устройство такое, что в памяти будет находиться лишь то, что на экране плюс пара строк в кеше - все.
R.id.team

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

Анна Антонова
Сообщения: 7
Зарегистрирован: 16 июн 2013, 16:02

Re: Урок 44. События в ListView

Сообщение Анна Антонова » 17 июн 2013, 11:03

Foenix писал(а):Анна, а причем здесь ООП? вы же про списки сказали? у них устройство такое, что в памяти будет находиться лишь то, что на экране плюс пара строк в кеше - все.
Мне казалось, что это справедливо, только если мы не создаем вьюшки на каждый элемент, а используем уже созданные (те, что отображаются на экране). У меня создается их столько, сколько элементов в списке - сотня, две, а то и больше. И на каждую вьюшку через new создается свой слушатель как новый объект.

Я пока не разбиралась внутренней кухней Андроида, поэтому и обратилась за помощью к знающим людям - я зря паникую или не зря? :)

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

Re: Урок 44. События в ListView

Сообщение KamiSempai » 17 июн 2013, 12:49

Анна, мой вам совет, постарайтесь вынести все действия при нажатии на элемент в отдельный и метод и вызывать его, без создания View.
Естественно, дабы не плодить кучу одинакового кода, этот метод стоит вызывать и при нажатии на элемент.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 44. События в ListView

Сообщение rezak90 » 17 июн 2013, 13:44

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

 view.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                Intent intent = new Intent(ctx, PreviewActivity.class); 
                intent.putExtra("name", itemStory.getName()); 
                intent.putExtra("date", itemStory.getDate()); 
                intent.putExtra("annotation", itemStory.getAnnotation()); 
                ctx.startActivity(intent); 
            } 
        });
И ещё, у Вас для каждого view создаётся обработчик, разумно вынести его как поле класса и в методе getView кидать лишь ссылку на обработчик view.setOnClickListener(listener) - так у Вас будет один объект, Вы будете только ссылаться на него. В Вашем же примере создаётся всё время новый обработчик для каждого view.
R.id.team
Политика на форуме запрещена

ligaron
Сообщения: 5
Зарегистрирован: 17 июн 2013, 20:16

Re: Урок 44. События в ListView

Сообщение ligaron » 17 июн 2013, 20:36

Здравствуйте, после ознакомления с уроком возник такой вопрос.
Имеется ListView. Элемент списка описан так:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tvText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tvText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>
Исходя из
...метод onItemClick(AdapterView<?> parent, View view, int position, long id), где
parent – View-родитель для нажатого пункта, в нашем случае - ListView
view – это нажатый пункт, в нашем случае – TextView из android.R.layout.simple_list_item_1
position – порядковый номер пункта в списке
id – идентификатор элемента,
можно ли в методе onItemClick как-то получить идентификатор именно того TextView (в строке элемента списка), на котором было нажатие?
В моем примере, view у меня указывает на LinearLayout, а как заглянуть глубже, сделать этот LinearLayout прозрачным, что-ли?..

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 44. События в ListView

Сообщение anber » 17 июн 2013, 20:50

ligaron писал(а):Здравствуйте, после ознакомления с уроком возник такой вопрос.
Т.е. элементы списка состоят не просто из TextView, а из LinearLayout который внутри себя содержит TextView?
В таком случае необходимо задать TextView какой-то ID в xml файле, и потом получить это TextView можно методом view.findViewById(R.id.my_id);
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Ответить