вопрос про getCheckedItemPositions

Интерфейс, диалоги, темы, стили, меню
Ответить
bandik
Сообщения: 7
Зарегистрирован: 06 окт 2012, 04:22

вопрос про getCheckedItemPositions

Сообщение bandik » 06 окт 2012, 04:37

Здравствуйте,
Уже несколько недель ищу решение проблемы. Есть ListView, каждый элемент которого представляет собой CheckedTextView и 3 TextView. Используя стандартный адаптер, выбрав (мои список).setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) при клике на пункт списка начинала происходить магия и чекинились совсем другие позиции. Порылся в интеренете, понял что проблема связанна с неправильным выделением строк списка(надеюсь правильно понял). Нашел очень много рекомендаций, что лучше создать свой адаптер. Создал, чекины стали адекватно работать. Но появилась другая проблема - функция списка getCheckedItemPositions перестала работать. Порылся в исходниках виджетов но так и не понял как список берет информацию о выделенных пунктах с адаптера(и берет ли он вообще ее от туда). Могли бы вы подсказать как вернуть работоспособность функции.
В качестве временно решения вернул штатный адаптер, поменял Mode на CHOICE_MODE_NONE и написал свою функцию схожу с getCheckedItemPositions. Но все токи хочется знать нормальное решение данной проблемы.
при необходимости могу выложить исходники свои.
Заранее спасибо!

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: вопрос про getCheckedItemPositions

Сообщение damager82 » 09 окт 2012, 16:31

А Урок 54 смотрели? Там есть пример кастомного адаптера с чекбоксами.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

bandik
Сообщения: 7
Зарегистрирован: 06 окт 2012, 04:22

Re: вопрос про getCheckedItemPositions

Сообщение bandik » 10 окт 2012, 14:11

damager82 писал(а):А Урок 54 смотрели? Там есть пример кастомного адаптера с чекбоксами.
Здравствуйте,
Да урок читал, как и писал выше свой адаптер делал, однако при использовании своего адаптера перестает корректно работать функция списка getCheckedItemPositions(), как и некоторые другие функции доступные для режима ListView.CHOICE_MODE_MULTIPLE. Поэтому пришлось вручную писать функции в адаптере и вызывать свои функции из адаптера. Но хочется пользоваться штатными функциями класса ListView.

bandik
Сообщения: 7
Зарегистрирован: 06 окт 2012, 04:22

Re: вопрос про getCheckedItemPositions

Сообщение bandik » 10 окт 2012, 14:24

Так же стоит отметить что пытался перезаписать стандартный адаптер, чекбоксы отлично чекинятся без каких либо косяков и контекстное меню работает, но опять же функция getCheckedItemPositions() перестает работать для режима мультивыбора.

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

SimpleAdapter sAdapter = new SimpleAdapter(this, data,
				R.layout.subjlist_item, from, to) {
			@Override
			public View getView(final int position, View convertView, ViewGroup parent) {

				View view = super.getView(position, convertView, parent);
				

				CheckedTextView ctv = (CheckedTextView) view
						.findViewById(R.id.checkedSubj); // присваиваем чекбоксу
															// обработчик
				ctv.setOnClickListener(new OnClickListener() {

					public void onClick(View v) {
						// TODO Auto-generated method stub
						CheckedTextView chk = (CheckedTextView) v
								.findViewById(R.id.checkedSubj);

						
						chk.toggle();
					}
				});
				
				

				return view;
			}
		};

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

Re: вопрос про getCheckedItemPositions

Сообщение rezak90 » 10 окт 2012, 14:53

лучше покажите код как вы пытаетесь получить getCheckedItemPositions();
R.id.team
Политика на форуме запрещена

bandik
Сообщения: 7
Зарегистрирован: 06 окт 2012, 04:22

Re: вопрос про getCheckedItemPositions

Сообщение bandik » 10 окт 2012, 17:11

rezak90 писал(а):лучше покажите код как вы пытаетесь получить getCheckedItemPositions();
Если я вас правильно понял.

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

//subjList - мой ListView 

SparseBooleanArray sbArray = subjList.getCheckedItemPositions();

Если нет, то я как раз и спрашиваю как реализована данная функция в ListView, чтобы адекватно настроить свой адаптер, так как проблема 100% в обработчике нажатия на пункт списка - видимо адаптер должен что то передавать. Сейчас активно роюсь в исходниках классов, но пока безуспешно.

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

Re: вопрос про getCheckedItemPositions

Сообщение rezak90 » 10 окт 2012, 17:22

не то как вызывается, а то как вы дальше читаете SparseBooleanArray , а то сдаётся что возможно не правильно читаете.
R.id.team
Политика на форуме запрещена

bandik
Сообщения: 7
Зарегистрирован: 06 окт 2012, 04:22

Re: вопрос про getCheckedItemPositions

Сообщение bandik » 10 окт 2012, 17:50

rezak90 писал(а):не то как вызывается, а то как вы дальше читаете SparseBooleanArray , а то сдаётся что возможно не правильно читаете.
Ну ребят, зачем уж в такие крайности то?(
Элементарная проверка в Log sbArray.size() дает 0.
Если прям совсем интересно как читаю

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

for (int i = 0; i < sbArray.size(); i++) {
	int key = sbArray.keyAt(i);
	
	if (sbArray.get(key))
	Log.d("checked", "true");
	else
	Log.d("checked", "false");
}
Сейчас рою в направление вручную при нажатии на элемент списка устанавливать ему view.setChecked() но либо крит вылетает либо ничего не происходит, вызываю данный метод в обработчике нажатия на CheckedTextView либо на саму View

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

Re: вопрос про getCheckedItemPositions

Сообщение rezak90 » 10 окт 2012, 18:35

Если перестала работать функция CHOICE_MODE_MULTIPLE то и getCheckedItemPositions() будет возвращать 0.
Вот здесь http://stackoverflow.com/questions/6352 ... parseboole такая же ситуация, хоть там и курсор, но смысл тот же.
Если не поможет то кидайте проект, проверю.
R.id.team
Политика на форуме запрещена

bandik
Сообщения: 7
Зарегистрирован: 06 окт 2012, 04:22

Re: вопрос про getCheckedItemPositions

Сообщение bandik » 10 окт 2012, 19:10

rezak90 писал(а):Если перестала работать функция CHOICE_MODE_MULTIPLE то и getCheckedItemPositions() будет возвращать 0.
Вот здесь http://stackoverflow.com/questions/6352 ... parseboole такая же ситуация, хоть там и курсор, но смысл тот же.
Если не поможет то кидайте проект, проверю.
Давайте по порядку.
1. я не писал свой listView, я делал свой адаптер, поэтому режим CHOICE_MODE_MULTIPLE работает нормально.
2. В теме что вы посоветовали вообще не про то.
3.Давайте попытаюсь еще раз объяснить.

У меня есть Список -listView, который создается на основе моего шаблона. В шаблоне - CheckedTextView и 3 TextView.
Задача - при нажатии на список или на ckeckbox, должна появляться галочка. После этого при нажатии на кнопку, которая ниже списка должна собираться информация о выбранных пунктах. Для этого хочу использовать функцию getCheckedItemPositions(), которая для этого и предназначена. Так же необходимо чтобы работало контекстное меню.

Почему использую checkedTextView - так как если вставить обычный checkbox то при нажатии на пункт списка, фокус уходит на checkbox и контекстное меню никак не вызвать.

Теперь проблемы
1. Для списка установлен режим CHOICE_MODE_MULTIPLE. В обработчик нажатия на пункт списка впихиваю следующее

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

CheckedTextView ctw = (CheckedTextView) view.findViewById(R.id.checkedSubj);
ctw.toggle();
Тоесть, нахожу элемент CheckedTextView, и меняю его состояние.

Что происходит в реальности - getCheckedItemPositions() работает ПРАВИЛЬНО, НО не те пункты отмечаются галочкой, тоесть тыкаю на первый, отмечается галкой последний например. Удалось выяснить что проблема связана с тем что при данном режиме списка, установка галочки уходит в отмеченную строку, но по каким то причинам строка на которую я тыкаю != отмеченной. Поэтому решил свой адаптер сделать.
2. Режим работы списка тот же. Наследую адаптер от SimpleAdapter. Меняю единственный метод.

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

@Override
	public View getView(final int position, View convertView, ViewGroup parent) {

		View view = super.getView(position, convertView, parent);
		if (view == null) {
			view = lInflater.inflate(R.layout.subjlist_item, parent, false);
		}
		

		CheckedTextView ctv = (CheckedTextView) view
				.findViewById(R.id.checkedSubj); // присваиваем чекбоксу
													// обработчик
		ctv.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				CheckedTextView chk = (CheckedTextView) v
						.findViewById(R.id.checkedSubj);

				

				chk.toggle();
			}
		});
				
		return view;
	}
Что происходит - При нажатии на checkbox галочки ставятся и убираются правильно. Но getCheckedItemPositions() возвращает 0. При нажатии на пункт(текст рядом с checkbox) галочки опять же ставятся нетуда, но getCheckedItemPositions() работает правильно.
Вывод - во всем виноват обработчик нажатий. Так как если в обработчике нажатия на view написать тоже что в обработчике нажатия checkbox, то getCheckedItemPositions() не работает, а галочки в любом случае нормально ставятся.

временно решил проблему создав свои необходимые функции, но ищу нормальное решение чтобы работали и штатные функции, такие как getCheckedItemPositions().

Теперь чего я отрыл в исходниках.(ну мне кажется что я правильно понял все)
метод getCheckedItemPositions() берет данные непосредственно с состояния элементов(view). В методе getView адаптера SimpleAdapler вызывается bindView в котором к некоторым элементам применяется метод setChecked(bool).
Я долго не думая решил в обработчике нажатия менять состояние view на которое нажали/всех view что в него входят, так же как написано в исходнике адаптера SimpleAdapter. Но ничего не получилось.

Ответить