【问题标题】:Updating an AlertDialog's ListView contents while running在运行时更新 AlertDialog 的 ListView 内容
【发布时间】:2017-10-22 05:37:09
【问题描述】:

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

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

alertDialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @覆盖 public void onItemClick(AdapterView parent, View view, int position, long id) { 如果(位置 >= 0) { 字符串[] 列表 = getCurrentFileList(); 如果(列表[位置].equals(NO_ITEMS_TEXT)){ 返回; } // 如果选中的文件是目录,递归更新文件列表并重新显示。 if(getCurrentFileRefList()[位置].isDirectory()){ src = getCurrentFileRefList()[位置]; 解析文件列表(); //todo 从加载的文件列表中更新 ListView }else { // 如果所选项目是文件,则将值提供给处理程序并关闭对话框。 handler.handleEvent(DialogActionEventHandler.ResultID.SUBMITTED, getCurrentFileRefList()[position]); alertDialog.dismiss(); } } } });

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

任何帮助将不胜感激!

【问题讨论】:

    标签: java android listview user-interface dialog


    【解决方案1】:

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

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

    【讨论】:

    • 由于我需要获取对 ListView 的 Adapter 的引用并将其转换为可以使用 notifyDatasetChanged 方法的变体,这是否意味着我还需要修改初始声明代码以改用 ArrayAdapter AlertDialog 的 Builder 中的列表设置方法的值的数组?
    • @MichaelRunzler 我建议使用以下 yourDialogInstance.getListView().getAdapter().notifyDataSetChanged()?
    • 我会,但是调用 .getListView().getAdapter() 会返回一个 ListAdapter 类型的对象,它没有 notifyDataSetChanged() 方法。它似乎是 BasicAdapter 的一个子类,所以我尝试将它转换为它并在其上调用 notifyDataSetChanged(),但虽然它没有抛出错误,但它似乎也没有真正做任何事情。看来,为了执行该方法,我需要知道为生成封装类型 ListAdapter 所提供的原始适配器,而我目前还没有找到...
    【解决方案2】:

    我最终通过一种解决方法解决了这个问题 - 方法如下。 由于 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();
                    }
                }
            }
        });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多