Android版本:3.1
API版本:Android 2.2
设备:摩托罗拉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这是我在任何论坛上的第一篇文章,所以如果我错过了对这篇文章的读者有帮助的东西,请告诉我。
我相信代码的行为是应该的。选择以前未选择的方法将在更改列表中项目的选中状态之前调用单击侦听器。换句话说,在onClick()
方法完成之前,isChecked()
不会为先前未选择的项返回true。
我注意到,至少对我来说,状态变化时的行为是不一致的;在模拟器上,isChecked((返回了点击前的状态,但在设备上,它返回了点击后的状态。
我绕过了"isChecked",只查看了我正在切换的底层对象的状态,因为除非我明确这样做,否则这不会改变。然而,这个解决方案可能取决于你的代码是如何设置的,而且可能还有其他我忽略的问题。
您应该使用MultiChoiceModeListener
来侦听检查。这是文档