Android: CheckedTextView isChecked возвращает неправильное значение - PullRequest
3 голосов
/ 23 сентября 2011

Версия 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 ]

3 голосов
/ 23 сентября 2011

Я считаю, что код ведет себя так, как должен.Выбор ранее невыбранного метода вызовет прослушиватель щелчков перед изменением отмеченного состояния элемента в списке.Другими словами, isChecked() не вернет true для ранее невыбранного элемента, пока метод onClick() не будет завершен.

2 голосов
/ 10 сентября 2013

Я заметил, что, по крайней мере, для меня поведение, когда состояние изменяется, не соответствует;в эмуляторе isChecked () возвратил состояние предварительного щелчка, но на устройстве оно вернуло состояние после щелчка.

Я справился с этим, вообще обойдя isChecked и просто просмотрев состояниеосновного объекта, который я переключаю, так как это не изменится, если я не сделаю это явно.Однако это решение может зависеть от того, как настроен ваш код, и могут быть другие ошибки, которые я пропускаю.

0 голосов
/ 23 сентября 2011

Вы должны использовать MultiChoiceModeListener для прослушивания чеков. Вот документация

...