вопрос про getCheckedItemPositions
вопрос про getCheckedItemPositions
Здравствуйте,
Уже несколько недель ищу решение проблемы. Есть ListView, каждый элемент которого представляет собой CheckedTextView и 3 TextView. Используя стандартный адаптер, выбрав (мои список).setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) при клике на пункт списка начинала происходить магия и чекинились совсем другие позиции. Порылся в интеренете, понял что проблема связанна с неправильным выделением строк списка(надеюсь правильно понял). Нашел очень много рекомендаций, что лучше создать свой адаптер. Создал, чекины стали адекватно работать. Но появилась другая проблема - функция списка getCheckedItemPositions перестала работать. Порылся в исходниках виджетов но так и не понял как список берет информацию о выделенных пунктах с адаптера(и берет ли он вообще ее от туда). Могли бы вы подсказать как вернуть работоспособность функции.
В качестве временно решения вернул штатный адаптер, поменял Mode на CHOICE_MODE_NONE и написал свою функцию схожу с getCheckedItemPositions. Но все токи хочется знать нормальное решение данной проблемы.
при необходимости могу выложить исходники свои.
Заранее спасибо!
Уже несколько недель ищу решение проблемы. Есть ListView, каждый элемент которого представляет собой CheckedTextView и 3 TextView. Используя стандартный адаптер, выбрав (мои список).setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) при клике на пункт списка начинала происходить магия и чекинились совсем другие позиции. Порылся в интеренете, понял что проблема связанна с неправильным выделением строк списка(надеюсь правильно понял). Нашел очень много рекомендаций, что лучше создать свой адаптер. Создал, чекины стали адекватно работать. Но появилась другая проблема - функция списка getCheckedItemPositions перестала работать. Порылся в исходниках виджетов но так и не понял как список берет информацию о выделенных пунктах с адаптера(и берет ли он вообще ее от туда). Могли бы вы подсказать как вернуть работоспособность функции.
В качестве временно решения вернул штатный адаптер, поменял Mode на CHOICE_MODE_NONE и написал свою функцию схожу с getCheckedItemPositions. Но все токи хочется знать нормальное решение данной проблемы.
при необходимости могу выложить исходники свои.
Заранее спасибо!
Re: вопрос про getCheckedItemPositions
А Урок 54 смотрели? Там есть пример кастомного адаптера с чекбоксами.
Re: вопрос про getCheckedItemPositions
Здравствуйте,damager82 писал(а):А Урок 54 смотрели? Там есть пример кастомного адаптера с чекбоксами.
Да урок читал, как и писал выше свой адаптер делал, однако при использовании своего адаптера перестает корректно работать функция списка getCheckedItemPositions(), как и некоторые другие функции доступные для режима ListView.CHOICE_MODE_MULTIPLE. Поэтому пришлось вручную писать функции в адаптере и вызывать свои функции из адаптера. Но хочется пользоваться штатными функциями класса ListView.
Re: вопрос про getCheckedItemPositions
Так же стоит отметить что пытался перезаписать стандартный адаптер, чекбоксы отлично чекинятся без каких либо косяков и контекстное меню работает, но опять же функция 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;
}
};Re: вопрос про getCheckedItemPositions
лучше покажите код как вы пытаетесь получить getCheckedItemPositions();
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: вопрос про getCheckedItemPositions
Если я вас правильно понял.rezak90 писал(а):лучше покажите код как вы пытаетесь получить getCheckedItemPositions();
Код: Выделить всё
//subjList - мой ListView
SparseBooleanArray sbArray = subjList.getCheckedItemPositions();
Re: вопрос про getCheckedItemPositions
не то как вызывается, а то как вы дальше читаете SparseBooleanArray , а то сдаётся что возможно не правильно читаете.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: вопрос про getCheckedItemPositions
Ну ребят, зачем уж в такие крайности то?(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");
}
Re: вопрос про getCheckedItemPositions
Если перестала работать функция CHOICE_MODE_MULTIPLE то и getCheckedItemPositions() будет возвращать 0.
Вот здесь http://stackoverflow.com/questions/6352 ... parseboole такая же ситуация, хоть там и курсор, но смысл тот же.
Если не поможет то кидайте проект, проверю.
Вот здесь http://stackoverflow.com/questions/6352 ... parseboole такая же ситуация, хоть там и курсор, но смысл тот же.
Если не поможет то кидайте проект, проверю.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: вопрос про getCheckedItemPositions
Давайте по порядку.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();
Что происходит в реальности - 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;
}
Вывод - во всем виноват обработчик нажатий. Так как если в обработчике нажатия на view написать тоже что в обработчике нажатия checkbox, то getCheckedItemPositions() не работает, а галочки в любом случае нормально ставятся.
временно решил проблему создав свои необходимые функции, но ищу нормальное решение чтобы работали и штатные функции, такие как getCheckedItemPositions().
Теперь чего я отрыл в исходниках.(ну мне кажется что я правильно понял все)
метод getCheckedItemPositions() берет данные непосредственно с состояния элементов(view). В методе getView адаптера SimpleAdapler вызывается bindView в котором к некоторым элементам применяется метод setChecked(bool).
Я долго не думая решил в обработчике нажатия менять состояние view на которое нажали/всех view что в него входят, так же как написано в исходнике адаптера SimpleAdapter. Но ничего не получилось.

