运行时更新AlertDialog的ListView内容

时间:2017-10-22 05:37:09

标签: java android listview user-interface dialog

我有一个AlertDialog实例,我将其用作文件选择对话框。它包括分层浏览功能 - 如果从列表中选择目录,它应该显示该目录中的文件列表。它还包括一个“上一级”按钮,返回上一个文件夹。我需要一种方法来在对话框显示时更新AlertDialog对象的内置ListView的内容,而无需从其构建器重新加载对话框对象。我知道适配器存在,但我需要一种从定义的实例变量而不是外部XML资源加载数据的方法。我重写onResume方法以避免在按下按钮时关闭对话框,这是我需要运行列表更新的地方。

这是我现在在onResume方法中选择按钮的OnClick监听器的代码。

alertDialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                if(position >= 0)
                {
                    String[] list = getCurrentFileList();

                    if(list[position].equals(NO_ITEMS_TEXT)){
                        return;
                    }

                    // If the selected file is a directory, recursively update the file list and redisplay.
                    if(getCurrentFileRefList()[position].isDirectory()){
                        src = getCurrentFileRefList()[position];
                        parseFileList();
                        //todo update ListView from loaded file list
                    }else { // If the selected item is a file, give the value to the handler and dismiss the dialog.
                        handler.handleEvent(DialogActionEventHandler.ResultID.SUBMITTED, getCurrentFileRefList()[position]);
                        alertDialog.dismiss();
                    }
                }
            }
        });

parseFileList();方法用于从所选源文件中获取当前文件列表。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

您应该通过调用notifyDatasetChanged通知UI更新列表 https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

更新适配器中的数据后,必须调用Adapter.notifyDatasetChanged。

答案 1 :(得分:0)

我最终通过一种解决方法解决了这个问题 - 这是怎么回事。 由于notifyDatasetChanged()方法在没有为初始创建阶段创建整个适配器类的情况下没有正确地将更新推送到对话框 - 我认为这对于我的目的来说太耗时且效率低 - 我通过重新启动对话框解决了这个问题每次需要更新时,通过使用带有指针的ArrayList跟踪当前目录在主树中相对于源目录的位置,该指针在每次用户切换文件夹时都会更新。此过程还需要使onCreate()方法能够重新启动,并允许手动调用onResume()方法。完成这些后,代码的结果部分如下所示:

alertDialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(position >= 0)
            {
                String[] list = getCurrentFileList();

                if(list[position].equals(NO_ITEMS_TEXT)){
                    return;
                }

                // If the selected file is a directory, recursively update the file list and redisplay.
                if(getCurrentFileRefList()[position].isDirectory()){
                    src = getCurrentFileRefList()[position];
                    hierarchyID ++;
                    onCreateDialog(null);
                    alertDialog.dismiss();
                }else { // If the selected item is a file, give the value to the handler and dismiss the dialog.
                    handler.handleEvent(DialogActionEventHandler.ResultID.SUBMITTED, getCurrentFileRefList()[position]);
                    alertDialog.dismiss();
                }
            }
        }
    });

这将丢弃旧对话框,更新层次树跟踪数组和关联指针,并使用新路径重新启动对话框。它比我希望的要复杂得多,但效果很好。我希望有人觉得这很有用!