Android:CheckedTextView isChecked返回不正确的值

时间:2011-09-23 15:24:53

标签: android checkedtextview

  

Android版:3.1
版本:Android 2.2版设备:Motorola MX604

我动态创建CheckedTextView项的多选ListView,并将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类:p我还看了很多以类似方式设置的例子。有人能发现问题吗?

感谢

PS这是我在任何论坛上的第一篇文章,所以如果我遗漏了一些对本帖的读者有帮助的内容,请告诉我。

3 个答案:

答案 0 :(得分:3)

我相信代码的行为方式应该如此。选择以前未选定的方法将在更改列表中项目的选中状态之前调用单击侦听器。换句话说,在isChecked()方法完成之后,onClick()将不会为之前未选择的项返回true。

答案 1 :(得分:2)

我注意到,对我来说,至少,状态变化的行为并不一致;在模拟器上,isChecked()返回了预单击状态,但在设备上它返回了单击后状态。

我绕过了#34; isChecked&#34;完全,只是看看我正在切换的基础对象的状态,因为除非我明确这样做,否则不会发生变化。但是,此解决方案可能取决于您的代码的设置方式,并且可能还有其他问题,我忽略了。

答案 2 :(得分:0)

您应该使用MultiChoiceModeListener来收听支票。 Here is the documentation