Android:CheckedTextView isChecked返回的值不正确

3
Android 版本:3.1
API 版本:Android 2.2
设备:Motorola MX604。
我动态创建了一个多选的 CheckedTextView 列表,然后将 OnItemClickListener 附加到 ListView 上。在监听器的 onItemClick 方法中,我调用 CheckedTextView 的 isChecked 方法来确定关联的复选框是否被选中或取消选中。很简单。
问题是:当我选择一个之前未选择的项目时,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类中。我还研究了许多设置类似的例子。有人能发现问题吗?

谢谢

PS:这是我在任何论坛上的第一篇帖子,如果我漏掉了对这篇文章读者有帮助的信息,请告诉我。


再次点击该项是否会显示与 isChecked() 相反的返回值? - John Leehey
是的。第一次选择之前未选择的项目时,它会返回 false。如果再次选择相同的项目,则返回 true。 - JavaJumper
3个回答

3

我认为代码的行为是正确的。选择一个之前未选中的方法将在更改列表项的选中状态之前调用单击侦听器。换句话说,isChecked()onClick() 方法完成之后才会返回先前未选中的项的 true 值。


这似乎是它的工作方式。不幸的是,isChecked方法是CheckedTextView类中唯一没有javadoc的方法。谢谢。 - JavaJumper
我看到了一个类似的问题,但不确定是否一致。当我在模拟器中运行一些代码时,它的运行方式与此处描述的相同(即isChecked()返回项目的“前单击”状态),但当我在实际设备上运行相同的代码时,它恰好相反(isChecked()返回“后单击”的状态)。 - sigmazero13

2
我注意到,至少对于我来说,状态改变时的行为不一致;在模拟器上,isChecked()返回了点击前的状态,但在设备上,它返回了点击后的状态。
我通过完全绕过"isChecked",只查看我正在切换的底层对象的状态来解决了这个问题,因为除非我明确地这样做,否则它不会改变。然而,这个解决方案可能取决于你的代码设置方式,而且可能有其他问题我没有考虑到。

0

您应该使用 MultiChoiceModeListener 来监听勾选操作。这里是文档


我最初考虑使用MultiChoiceModeListener。但它需要API级别11,而该应用程序的API级别为8。 - JavaJumper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接