Android列表视图澄清任务

时间:2009-12-09 16:31:24

标签: android listview checkbox

我的情景:
- 我在多选模式下使用列表视图来启用用户 立即删除他/她已检查过的几件物品 - 当用户单击删除按钮时,我执行以下操作:
使用以下命令检查项目的 -get位置:myList.getCheckedItemPositions();
- 获取此位置的项目并将它们放入列表 - toDeleteList - (基于此步骤的问题)使用myList.setItemChecked(position, false)取消选中列表项 - 删除“toDeleteList”

中的项目

现在,我被“强制”手动取消选中列表项,因为myList.getCheckedItemPositions()的结果在从mylist中删除后没有改变..即

-if,例如,我删除列表[a,b,c,d], b 的第1项(a) 将在删除后显示检查即。列表中的列表[b,c,d] - 删除后。

问题是为什么?因为SparseBooleanArray返回了 myList.getCheckedItemPositions();在之后是 从列表中删除 - 使用适配器。

从列表中删除项目后,我想(我可能错了) 通过适配器,CheckedItemPositions数组也应更改为 反映列表的新状态

例如。 - mylist = [a,b,c,d]
- 然后检查位置0和3检查的项目(a& d)
- 现在检查项目位置(mylist.getCheckedItemPositions())数组 位置0和3的值为true - 如果我删除&因此,列表中的d,mylist = [b,c], mylist.getCheckedItemPositions()仍然与上面相同即。从列表中删除项目后仍然检查位置0和3(我认为这不正常 - 但我再次错了)
- 我期待不检查0和0的位置3因为 以前在这些位置的项目不再在列表中。

我在这里弄错了(或者说错了 期望 :) ) ?有人请澄清这一点。
提前谢谢,

3 个答案:

答案 0 :(得分:2)

我正在努力解决同样的问题,这对我有用。

首先,我设置了一个游标适配器,根据其ID保持项目检查状态,因为当列表可以动态更改时,位置无用。

private class TagListAdapter extends SimpleCursorAdapter {
    /**
     * Stores boolean values for the list items, based on their ids.
     */
    SparseBooleanArray mCheckStates;

    public TagListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
        mCheckStates = new SparseBooleanArray();
    }

    /**
     * Sets an id as checked/unchecked.
     * @param id
     * @param checked
     */
    public void setChecked(int id, boolean checked) {
        mCheckStates.put(id, checked);
    }

    /**
     * @see android.widget.ListAdapter#getView(int, View, ViewGroup)
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);

        if(!mCursor.moveToPosition(position)) {
            throw new IllegalStateException("couldn't move cursor to position " + position);
        }

        int id = mCursor.getInt(INDEX_OF_COLUMN_ID);
        if(mCheckStates.indexOfKey(id) < 0) {
            // Populate checked value for the first time.
            mCheckStates.put(id, function_that_returns_if_the_item_is_checked(id));
        }

        // Set the item as checked or unchecked based on the value stored in mCheckStates.
        mListView.setItemChecked(position, mCheckStates.get(id, false));
        return view;
    }
}

然后在我的活动中,我设置了一个onListItemClick(),它执行相关的check / uncheck操作并在适配器中设置检查状态:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    boolean checked = ((CheckedTextView) v).isChecked();

    if(checked == true) {
        // execute uncheck related action
        function_called_when_item_is_unchecked(id);
    } else {
        // execute check related action
        function_called_when_item_is_checked(id);
    }

    // Check/uncheck the item in the adapter.
    ((TagListAdapter) getListAdapter()).setChecked((int) id, !checked);
}

答案 1 :(得分:1)

说出我的个人意见,我假设这些职位仍然会被检查,因为getCheckedItemPositions()反映了与价值相对的立场,所以如果删除后ListView内的职位0和3仍然存在,他们将继续检查。

我可能是错的,只是表达我自己的意见。祝你好运

答案 2 :(得分:0)