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 для прослушивания чеков. Вот документация

Другие вопросы по тегам