在Android中使用onPrepareDialog方法中的removeDialog()刷新列表对话框

时间:2011-06-24 22:14:36

标签: android

在onPrepareDialog中调用removeDialog(int)被认为是不好的形式,如下所示强制每次使用showDialog()调用时重新创建对话框:

@Override
public void onPrepareDialog(int id, Dialog dialog) 
{
    switch(id) 
    {
        case REMOVE_WATCH_WORD :
            removeDialog(REMOVE_WATCH_WORD);
            break;

    }
 }

并在onCreateDialog中我用这个case参数处理它:

case REMOVE_WATCH_WORD :
CustomHelper ch = new CustomHelper();
final CharSequence[] watchWordsCharSequence = ch.getWatchWordsAsCharSequence(getApplicationContext());

return new AlertDialog.Builder(ActivityName.this)

    .setTitle("Remove Word from List")

    .setItems(watchWordsCharSequence, new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int item) {
            Toast.makeText(getApplicationContext(), "\"" + watchWordsCharSequence[item] + "\" removed from List!", Toast.LENGTH_SHORT).show();
            String removeString = (String) watchWordsCharSequence[item];
            SharedPreferences.Editor editor = watchWords.edit();
            editor.remove(removeString);
            editor.commit();
        }
    }).create();

每次调用对话框时强制重新绘制对象是不是被认为是错误的形式?这样做的好处/缺点是什么?

2 个答案:

答案 0 :(得分:4)

是的,我会考虑这种糟糕的形式。它甚至有用吗?即使在您第一次创建对话框后,也会调用onPrepareDialog(),这意味着您在创建之后立即选择删除对话框。看起来对我有问题。

Activity公开showDialog()dismissDialog()onCreateDialog()onPrepareDialog()系列方法的全部原因是能够有效管理Dialog的生命周期,特别是,您不必手动保持对话框的引用。惯用生命周期是您在onCreateDialog()中创建对话框,包括附加您需要的任何事件侦听器。然后在onPrepareDialog()中初始化值,例如文本,初始值等等 - 或者换句话说“刷新”对话框以进行即将显示。应该没有理由在显示之间销毁和重新创建对话框。您应该实际查看正确刷新内容所需的内容,而不是使用removeDialog()来“刷新”它。通常会涉及.getAdapter().notifyDataSetInvalidated()之类的内容,或者如果使用CursorAdapter,则调用requery()以强制它重新运行查询并更新适配器内容。

如果您执行发现您仍然需要删除并重新创建对话框,那么我建议您放弃整个Activity - 托管对话框,然后在需要时创建对话框它并调用其show()方法。完成后,请关闭GC并将其排入队列。这绕过了Activity公开的整个show / create / prepare过程。

我建议坚持使用Activity管理的对话框,但如果你计划每次都删除对话框,那就不行了 - 在这种情况下只是实例化并.show()

答案 1 :(得分:0)

我认为删除Dialog的想法是一种有趣的方法,而不是为轻量级动态列表制作自定义适配器的开销。乍一看,从onPrepareDialog()中删除可能不是大多数实现的最佳方法。

另一种方法是仅在更新列表的动态数据时删除对话框。

private final int DIALOG_ID = 1;
String mDialogList[] = {"item 1","item 2"};

private void updateListData(){
    mDialogList = new String[]{"new item 1","new item 2"};
    removeDialog(DIALOG_ID);
}

使用此方法,对话框将仅在基础数据更改后重建,否则应由活动正常缓存和管理。