使用AlertDialog后无法删除LIstView中的选定项目

问题描述

这是我的问题:

在我的应用程序中,我为ListView设置了ChoiceMode(CHOICE_MODE_MULTIPLE_MODAL)和MultiChoiceModeListener方法,以便允许用户使用上下文菜单删除列表中的项目。我将以下代码放入onActionItemClicked方法中,一切正常:

        @Override
        public boolean onPrepareActionMode(ActionMode mode,Menu menu) {
            return false;
        }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        //Clear the list of selected item's id when the user exit the context menu bar.
        mSelectedItemIdList.clear();
    }

        @Override
        public boolean onActionItemClicked(ActionMode mode,MenuItem item) {
            switch (item.getItemId()){
                case R.id.menu_select_delete:
                    deleteSelectedItem();
                    mode.finish();
                    return true;
                default:
                    return false;
            }
        }

        private void deleteSelectedItem(){
    int totalRowDeleted = 0;

    if (!mSelectedItemIdList.isEmpty()){
        for (int i = 0; i < mSelectedItemIdList.size(); i++){
            long idindatabase = mSelectedItemIdList.get(i);
            Uri selectedItemUri = ContentUris.withAppendedId(TimeEntry.CONTENT_URI,idindatabase);
            int rowDeleted = getContentResolver().delete(selectedItemUri,null,null);

            if (rowDeleted != 0){
                totalRowDeleted++;
            }
        }
    }

    if (totalRowDeleted == 0){
        Toast.makeText(MainActivity.this,getString(R.string.delete_error_message),Toast.LENGTH_SHORT).show();
        return;
    }

    Toast.makeText(MainActivity.this,totalRowDeleted + " " + getString(R.string.delete_success_message),Toast.LENGTH_SHORT).show();
}

但是在我添加AlertDialog进行确认之后,

@Override
public boolean onActionItemClicked(ActionMode mode,MenuItem item) {
    switch (item.getItemId()){
        case R.id.menu_select_delete:
            showDeleteSelectedConfirmationDialog();
            mode.finish();
            return true;
        default:
            return false;
    }
}

private void showDeleteSelectedConfirmationDialog(){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(getString(R.string.delete_selected_confirmation));
    builder.setPositiveButton(getString(R.string.confirm),new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog,int which) {
            deleteSelectedItem();
        }
    });
    builder.setNegativeButton(getString(R.string.cancel),int which) {
            if (dialog != null){
                dialog.dismiss();
            }
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}

该应用程序不会崩溃,但是 deleteSelectedItem()无法正常运行!程序以某种方式无法到达方法内部for循环中的内容。也许我犯了一些简单的错误。谁能帮我吗?

解决方法

我解决了这个问题。

每次AlertDialog出现时,都会调用onDestroyActionMode()方法。因此,我删除了onDestroyActionMode()中的代码,并添加了用于删除记录后清除列表的代码。

private void deleteSelectedItem(){
int totalRowDeleted = 0;

if (!mSelectedItemIdList.isEmpty()){
    for (int i = 0; i < mSelectedItemIdList.size(); i++){
        long idInDatabase = mSelectedItemIdList.get(i);
        Uri selectedItemUri = ContentUris.withAppendedId(TimeEntry.CONTENT_URI,idInDatabase);
        int rowDeleted = getContentResolver().delete(selectedItemUri,null,null);

        if (rowDeleted != 0){
            totalRowDeleted++;
        }
    }
}

if (totalRowDeleted == 0){
    Toast.makeText(MainActivity.this,getString(R.string.delete_error_message),Toast.LENGTH_SHORT).show();
    return;
}

Toast.makeText(MainActivity.this,totalRowDeleted + " " + getString(R.string.delete_success_message),Toast.LENGTH_SHORT).show();

//Clear the list of selected item's id after delete the records.
mSelectedItemIdList.clear();

}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...