如何用所选目录的文件替换 recyclerview 中的现有内容?

Posted

技术标签:

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

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

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

感谢任何帮助。谢谢。

【问题讨论】:

【参考方案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,但我仍然可以提供帮助!

以上是关于如何用所选目录的文件替换 recyclerview 中的现有内容?的主要内容,如果未能解决你的问题,请参考以下文章

solidworks如何用同名零件替换

如何用python做一个显示文件目录的GUI?

如何用java代码把一个jar包里的文件替换掉

如何用 Maven 属性替换 web.xml 中的值?

如何用webstorm来检查静态代码

如何用recyclerview和viewpager2实现exoplayer?