【问题标题】:How do i replace the existing contents in the recyclerview with the selected directory's files?如何用所选目录的文件替换 recyclerview 中的现有内容?
【发布时间】:2018-01-09 11:33:14
【问题描述】:

在上图中,第一个选项卡显示了 sdcard 根目录中的文件/文件夹。我正在使用复选框来选择文件。问题是当我选择一个文件夹时,我想用所选文件夹文件的内容替换 Recyclerview 内容。如果文件夹有子文件夹,则单击该子文件夹应再次替换内容。基本上,我想要文件浏览器的功能。我还希望它记住哪些文件已被检查,因为这些文件将被发送到另一台设备。

显示现有Recyclerview 的代码相当简单。我将文件的 ArrayList(在根目录内)分配给 Recyclerview 适配器。

感谢任何帮助。谢谢。

【问题讨论】:

    标签: android android-recyclerview file-manager


    【解决方案1】:

    如果你选择一个子文件夹,你可以重置Adapter的数据。

    例子:

    • 当前路径:X
    • 在该路径中单击的文件夹:示例

    现在您想列出路径 X/example 的文件/文件夹。因此,您将始终将当前路径存储在适配器中,并创建一个名为 update 或类似的方法,其中输入是新路径。然后你更新适配器,瞧!如果用户决定从路径 X/example 回到路径 X,只需在最后一次出现“/”时切断当前路径。

    我会用伪代码给你演示一下:

    class Adapter {
      String path;
      List<String> currFileNames;
    
      void updateFiles(String destPath) {
        path = destPath;
        currFileNames = //Fetch file names from system
        notifyDataSetChanged()
    
      }
    
      void goOneLevelUp() {
        path = //substring path from X/example down to X 
        updateFiles(path)
      }
    }
    

    如果您总是想保留对“旧”字段的引用,例如在路径 X 中,而不总是替换它们,您可以按如下方式调整整个内容:

    创建一个包含路径和列表文件名的类

    class FileNameHolder {
      String path
      List<String> fileNames
    }
    

    在适配器中保留路径但替换列表

    class Adapter {
      String path;
      List<FileNameHolder> fileNameHolders
      List<String> currFileNames
    
      void updateFiles(String destPath) {
        path = destPath
        if (fileNameHolders.has(path)) {
          currFileNames =  fileNameHolders.wherePathEquals(path).currFilenames
        } else {
          FileNameHolder holder = new FileNameHolder(path, fetchFileNamesFromSystemForPath(path))
          fileNameHolders.add(fileNameHolder)
          currFileNames = fileNameHolder.currFileNames
        }
        notifyDataSetChanged()
      }
    
      void goOneLevelUp() {
        path = //substring path from X/example down to X 
        currFileNames =  fileNameHolders.wherePathEquals(path).currFilenames
      }
    }
    

    如您在评论中提到的那样处理Backnavigation 的情况: 在适配器中添加一个名为 backPressed() 的公共方法,如下所示:

       public boolean backPressed() {
          if (path.contains("/")) { //assuming that - continuing our example X would be the root path and X/example would be one level down. so if the path contains a "/" you are not at the root level
            goOneLevelUp()
            return true
          } else {
            return false;
          }
        }
    

    在您的 Fragment / Activity 或您的 RecyclerView 存在的任何地方,像这样覆盖 onBackPressed():

    @Override
    onBackPressed() {
      if (!recyclerView.getAdapter().backPressed()) {
         super.onBackPressed()
      }
    }
    

    只要您的RecyclerView Adapter 可以“使用”后按(更新数据),它就会返回true。但是,如果文件路径位于根级别,它将返回 false,因此应该调用 superclass onBackPressed(否则您将无法退出此视图)。

    请记住,所有内容都是伪代码,是我直接写的。没有测试什么的。不过应该可以,否则请告诉我,我会编辑我的答案:)

    【讨论】:

    • 但是如何保留已检查的项目?
    • 更新了我的答案..希望现在可以正常工作:)。哦,currFileNames 保存您将显示的文件名
    • 嗨。我实现了替换当前目录的部分,效果很好。所以谢谢你。现在我有另一个问题。我在包含 recyclerview 的片段中添加了一个后退按钮。现在我需要将后退按钮单击(从片段)传送到 recyclerview 适配器,以便我可以再次更改 recyclerview 的内容。有什么帮助吗?
    • 我最终使用了不同的方法.. 但它解决了我的问题。感谢您的所有帮助
    • 哦,好的:3,但我仍然可以提供帮助!
    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2016-10-18
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多