我在列表视图中获取Checked Items时遇到问题。 问题是无论什么时候我调用getCheckedItemsCount()或getCheckedItemPositions()它总是返回1.无论是否检查了0或2或更多的项目。
这是我的MainActivity,它实现了MultiChoiceModeListener,以便在检查项目时进行侦听。 我这样做是因为我在ListAdapter上动态检查项目。
public class MainActivity extends ListActivity implements MultiChoiceModeListener
{
@Override
protected void onCreate (Bundle bundle)
{
super.onCreate (bundle);
// Set our view from the "main" layout resource
setContentView (R.layout.main);
this.getListView().setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
this.getListView().setMultiChoiceModeListener(this);
_dataAdapter = new ServerListAdapter (this);
this.getListView(). setAdapter(_dataAdapter);
registerForContextMenu (this.getListView());
}
// This is called when i set the item as checked using setItemChecked on my ListAdapter.
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean isChecked) {
SparseBooleanArray checke = getListView().getCheckedItemPositions();
// This always returns 1. No matter If I have 0 or 2 items checked.
int checkedCount = checkedItemPositions.size();
// I Have also tried with getCheckedItemsCount() and it returns 1 too.
if (checkedCount > 0)
{
// DO SOMETHING...
}
else
{
// DO SOME OTHER STUFF...
}
}
这是我的ListAdapter的代码。这里只有相关的代码:
public class ServerListAdapter extends BaseAdapter {
@Override
public View getView (final int position, final View convertView, final ViewGroup parent)
{
final ListView listView = (ListView)parent;
boolean isChecked = listView.isItemChecked(position);
((CheckBox)view.findViewById(R.id.chkItemServerSelected)).setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton pCompound, boolean arg1)
{
boolean isChecked = listView.isItemChecked(position);
// Here i set the item as checked, o unchecked. This works ok.
listView.setItemChecked(position, !isChecked);
}
});
//Finally return the view
return view;
}
}
修改
环顾四周后,我发现问题在于我做错了。
在我的列表适配器上,在onCheckedChanged上,而不是使用列表视图中的当前值get,我不得不使用复选框中的值,(因为那是我试图实现的目标) )。
上一个代码:
listView.setItemChecked(position, !isChecked);
新代码:
listView.setItemChecked(position, pCompound.isChecked());
事情是,这带来了一个新问题。 当选中的值IsChecked为 TRUE 时,会引发onItemCheckedStateChanged事件,但当值 FALSE 时,它不会...任何线索?
答案 0 :(得分:0)
我相信您在基础适配器中缺少一些覆盖。我认为你需要实现这样的东西:(除了getView)
@Override
public int getCount() {
return myarray.size();
}
@Override
public Object getItem(int position) {
return myarray.get(position);
}
@Override
public long getItemId(int position) {
return myarray.get(position).getId();
}
答案 1 :(得分:0)
问题是ListView实例全部搞砸了,所以我没有使用项目列表视图的选中值,而是使用了CheckBox控件的ckeched值。
此更改是在复选框的onCheckedChanged方法的ListAdapter上进行的:
上一个代码:
listView.setItemChecked(position, !isChecked);
新代码:
listView.setItemChecked(position, pCompound.isChecked());