0

我在由 Custom 绑定的列表中有复选框列表simpleCursorAdapter。在我的 customsimpleCursorAdapter中,我已经覆盖newViewbindView进行了修改。我设法以某种方式进行多项选择。奇怪的是,在我从列表中删除任何项目后,第一个项目的复选框突然被选中。这是怎么发生的?我该如何解决?

我的SimpleCursorAdapter班级:

public class MyListCursorAdapter extends SimpleCursorAdapter
{
    private Context context;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to)
    {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    {
        Cursor c = getCursor();
        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);
        CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
        if (chkBoxBtn != null)
        {
            chkBoxBtn.setChecked(false);
        }
        return v;
    }

    @Override
    public void bindView(View v, Context context, Cursor c)
    {
        --binding view to my textsview in my items
        //now it's the importat part:
            CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
    if (chkBoxBtn != null)
    {
        chkBoxBtn.setId(Integer.valueOf(c.getString(c
                .getColumnIndex(MyUsers.User._ID))));
        chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
        chkBoxBtn.setChecked(false);
    }
    }

    //i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
    static ArrayList<String> checkedItemsList = new ArrayList<String>();

    private class OnItemClickListener implements OnClickListener
    {
        private int mPosition;
        private CheckBox chkBox;
        OnItemClickListener(CheckBox mChkBox, View v)
        {
            chkBox = mChkBox;
            chkBox.setChecked(false);
        }

        @Override
        public void onClick(View v)
        {
            if (chkBox.isChecked())
            {
                checkedItemsList.add(String.valueOf(chkBox.getId()));
            }
            else
            {
                checkedItemsList.remove(String.valueOf(chkBox.getId()));
            }
        }
    }
}

这是ListActivity该类中的代码部分,它描述了删除复选框项目的按钮:

OnClickListener btListener = new OnClickListener()
{
    public void onClick(View view)
    {
        // long[] items = listView.getCheckItemIds();
        int x = 0;
        Uri myUri = Uri
        .parse("content://com.idan.datastorageprovider/users");
        String where = "_id" + "=?";
        //here i am tatking all checkboxes which ive added from the  adapter class
        ArrayList<String> checkedItemsList =   MySimpleCursorAdapter.checkedItemsList;
        for (String itemID : checkedItemsList)
        {
            getContentResolver()
            .delete(myUri, where, new String[] { itemID});
            checkedItemsList.remove(itemID);
        }
    }
};
4

3 回答 3

2

我怀疑 SimpleCursorAdapter 是在这里扩展的正确类。

“检查”状态是否以任何方式连接到数据 XML?不?因此,您需要自己的自定义适配器!

基本上所有适配器都必须实现一种从给定元素(更准确地说是元素位置!)生成视图的方法。这将在列表想要显示元素的任何时候调用。现在,它使用的技巧是重新使用以前创建的列表视图元素,这些元素再也不能在屏幕上看到了!因此:当您向下滚动列表并且元素在顶部消失时,该视图对象将被重新用于下一个出现的项目。

因此,当使用应该重用的给定“旧”视图调用此方法时,必须根据元素数据设置所有包含的元素。如果复选框是该游戏的一部分,则您必须为选中状态存储空间!有一个复选框是不够的,因为有列表元素,所以复选框对象会更少!

SimpleCursorAdapters 是用来 - 是的 - 代表简单的东西。描述数据的 XML(图像和文本,如文档所述)。由于这种简单性,您所要做的就是提供一种创建新元素视图对象的方法——您根本不会拦截重用过程!它基本上只知道如何将数据放入现有的视图对象中 - 但它缺乏如何处理选中/未选中框的知识!

您的解决方案:编写您自己的 BaseAdapter 扩展并做必须做的事情:实现“getView”(以及其他一些方法,如 getItem、getItemId 和 getCount)。一点都不难!这个API Demo使用了 BaseAdapter,mExpanded这里的状态和你的复选框状态基本一致!

祝你好运!

于 2010-02-16T11:51:51.517 回答
0

修改数据时可能需要调用notifyDataSetChanged 。

于 2010-02-16T01:58:08.137 回答
0

问题可能是您从 onItemClickListener 中调用 setChecked。解决此问题的一种巧妙方法是在您从侦听器中调用 setChecked 之前和之后执行以下操作:

chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);

这将防止您在手动调用 setChecked 时调用 onItemClickListener。

于 2010-02-16T05:19:26.047 回答