Android 使用包含复选框的自定义listadapter从ListActivity中删除项

Android 使用包含复选框的自定义listadapter从ListActivity中删除项,android,listview,checkbox,listactivity,Android,Listview,Checkbox,Listactivity,我正在尝试从具有自定义列表适配器的listactivity中删除列表项。自定义列表适配器具有文本视图和复选框。当用户通过单击复选框选择项目时,屏幕底部会出现一个按钮,单击按钮,我想从适配器中删除项目。我已经实现了这个解决方案,将位置设置为标记为checkbox,但它不起作用。选中的位置和listview索引未正确映射。我在这里发布我的代码: 列表适配器 无论何时选中复选框,按钮都会出现在底部以删除项目。显示代码和删除代码的按钮如下所示: 当复选框选择的项目不止一个时显示按钮: <code&

我正在尝试从具有自定义列表适配器的listactivity中删除列表项。自定义列表适配器具有文本视图和复选框。当用户通过单击复选框选择项目时,屏幕底部会出现一个按钮,单击按钮,我想从适配器中删除项目。我已经实现了这个解决方案,将位置设置为标记为checkbox,但它不起作用。选中的位置和listview索引未正确映射。我在这里发布我的代码:

列表适配器 无论何时选中复选框,按钮都会出现在底部以删除项目。显示代码和删除代码的按钮如下所示:

当复选框选择的项目不止一个时显示按钮:

<code>
public void itemsSelected(ArrayList<Integer> positions)
    {
        Log.i("mustang", "positions.size(): " + positions.size());
        deleteItemsButton.setText("Delete " + positions.size() + " mails?");
        deleteItemsButton.setVisibility(positions.size() > 0 ? Button.VISIBLE : Button.INVISIBLE);
    }

</code>
当用户单击它时,将运行以下代码:

<code>
private OnClickListener deleteItemsListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            ArrayList<Integer> positions = emails.getCheckedPositions();

            for(Integer p : positions)
            {
                emails.remove(emails.getItem(p.intValue()));
            }


            emails.notifyDataSetChanged();
        }
    };
</code>
请指出我正在以正确的方式实施该技术


提前感谢。

现在还不清楚什么不起作用,或者你所说的未正确映射是什么意思。当我选择索引1,2处的项目,然后单击“删除”按钮时,位置错误的项目将被删除,并且在适配器上调用notifyDataSetChanged后,复选框仍处于选中状态,你是说哪一个?实际上随机定位的元素被移除了。事实上,我认为当我通知datasetchanged时,项目会被刷新,但没有重新绘制,这意味着项目的位置指向旧数据,而不是新位置。您不需要通知datasetchanged,因为您直接从适配器中删除。在创建适配器的地方张贴代码,因为底层数据可能在其他地方被操纵。
<code>
private OnClickListener deleteItemsListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            ArrayList<Integer> positions = emails.getCheckedPositions();

            for(Integer p : positions)
            {
                emails.remove(emails.getItem(p.intValue()));
            }


            emails.notifyDataSetChanged();
        }
    };
</code>