问题描述
这是我的问题:
在我的应用程序中,我为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();
}