无法从ListView获取实际的Checked Items

时间:2013-03-21 17:14:31

标签: android android-listview

我在列表视图中获取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 时,它不会...任何线索?

2 个答案:

答案 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());