Android:CheckedTextView isChecked возвращает неверное значение
Версия Android: 3.1
Версия API: Android 2.2
Устройство: Motorola MX604
Я динамически создаю множественный выбор ListView элементов CheckedTextView и присоединяю OnItemClickListener к ListView. В методе прослушивателя onItemClick я вызываю метод isChecked объекта CheckedTextView, чтобы определить, установлен ли соответствующий флажок или нет. Достаточно просто.
Проблема: когда я выбираю ранее невыбранный элемент, метод isChecked возвращает false. Когда я выбираю ранее выбранный элемент, метод возвращает true. Сам значок флажка проверяет и снимает флажки правильно.
Вот макет для CheckedTextView:
<CheckedTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:drawableLeft="?android:attr/listChoiceIndicatorMultiple"
android:paddingLeft="6dip" android:paddingRight="6dip"
/>
Вот как я создаю ListView:
private void createSortedChannelList() {
emptyViewContainer();
ListView sortedListView = new ListView(this);
sortedListView.setId(CHANNEL_LISTVIEW_ID);
sortedListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
sortedListView.setItemsCanFocus(false);
sortedListView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
CheckedTextView selectedItem = (CheckedTextView) view;
boolean isChecked = selectedItem.isChecked();
Log.e(mLogTag,"item clicked position = " + position + " isChecked = " + isChecked);
}
});
ArrayAdapter<Channel> listAdapter =
new ArrayAdapter<Channel>(this,R.layout.favorite_channel_list_select_channel_row,mAllChannels);
sortedListView.setAdapter(listAdapter);
for(int channelIndex = 0;channelIndex < mChannelIds.length;channelIndex++){
if(mSelectedChannelIds.contains(mChannelIds[channelIndex]))
sortedListView.setItemChecked(channelIndex, true);
}
addViewToViewContainer(sortedListView);
}
Это вывод журнала, который создается, когда я выбираю ранее невыбранный элемент:
09-23 09:08:59.650: item clicked position = 19 isChecked = false
и когда я выбираю ранее выбранный элемент
09-23 09:10:20.800: item clicked position = 18 isChecked = true
Я сделал обширный поиск, и я могу найти только один другой отчет о похожем поведении. Это заставляет меня поверить, что проблема, вероятно, заключается в моем коде, а не в классе Android: p Я также рассмотрел многочисленные примеры, которые созданы аналогичным образом. Кто-нибудь может определить проблему?
Спасибо
PS Это мой первый пост на любом форуме, поэтому, если я пропускаю что-то, что было бы полезно читателям этого поста, пожалуйста, дайте мне знать.
3 ответа
Я считаю, что код ведет себя так, как должен. Выбор ранее невыбранного метода вызовет прослушиватель щелчков перед изменением отмеченного состояния элемента в списке. Другими словами, isChecked()
не вернет true для ранее не выбранного элемента до onClick()
Метод закончен.
Я заметил, что для меня, по крайней мере, поведение, когда состояние меняется, не соответствует; в эмуляторе isChecked() возвращает состояние предварительного щелчка, а на устройстве - состояние после щелчка.
Я справился с этим, полностью обойдя isChecked и просто посмотрев на состояние базового объекта, который я переключаю, поскольку это не изменится, если я не сделаю это явно. Однако это решение может зависеть от того, как настроен ваш код, и могут быть другие ошибки, которые я пропускаю.
Вы должны использовать MultiChoiceModeListener
для прослушивания чеков. Вот документация