Страница 3 из 8

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

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

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

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

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

Добавлено: 06 фев 2013, 19:29
rezak90
чего не понятного, если существуют одинаковые события у ребёнка и родителя, то перехватываться они будут родителем, до ребёнка не дойдёт, вот такая дедовщина =)

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

Добавлено: 06 фев 2013, 19:46
dcbp
А почему тогда такое же событие на ImageView отрабатывает нормально?
И кстати почему кнопочка это родитель, а сам элемент списка потомок?

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

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

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

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

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

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

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

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

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

Добавлено: 06 май 2013, 15:00
igrok-vip
Это я понял, но как их туда положить при заполнении адаптера? Ведь мы туда передаём только массив данных(список данных) и layout для item'a. А как передать ещё и id?

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

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

Добавлено: 06 май 2013, 15:24
igrok-vip
Блин не понял таки) Скажите какой конструктор выбирать и в каком виде туда передать id шки? Сейчас они у меня в ArrayList. Или всё-таки как-то по другому?

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

Добавлено: 06 май 2013, 17:54
rezak90
igrok-vip писал(а):Блин не понял таки) Скажите какой конструктор выбирать и в каком виде туда передать id шки? Сейчас они у меня в ArrayList. Или всё-таки как-то по другому?
для работы с базой и отображения её в листе лучше использовать simplecursoradapter, тогда и id будет автоматом подстраиваться

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

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

Добавлено: 16 июн 2013, 22:33
rezak90
Так ли это?
нет)

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

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

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

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

Добавлено: 17 июн 2013, 11:00
Foenix
Анна, а причем здесь ООП? вы же про списки сказали? у них устройство такое, что в памяти будет находиться лишь то, что на экране плюс пара строк в кеше - все.

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

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

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

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

Добавлено: 17 июн 2013, 12:49
KamiSempai
Анна, мой вам совет, постарайтесь вынести все действия при нажатии на элемент в отдельный и метод и вызывать его, без создания View.
Естественно, дабы не плодить кучу одинакового кода, этот метод стоит вызывать и при нажатии на элемент.

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

Добавлено: 17 июн 2013, 13:44
rezak90

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

 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.

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

Добавлено: 17 июн 2013, 20:36
ligaron
Здравствуйте, после ознакомления с уроком возник такой вопрос.
Имеется 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 прозрачным, что-ли?..

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

Добавлено: 17 июн 2013, 20:50
anber
ligaron писал(а):Здравствуйте, после ознакомления с уроком возник такой вопрос.
Т.е. элементы списка состоят не просто из TextView, а из LinearLayout который внутри себя содержит TextView?
В таком случае необходимо задать TextView какой-то ID в xml файле, и потом получить это TextView можно методом view.findViewById(R.id.my_id);