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

时间:2018-01-09 11:33:15

标签: android android-recyclerview recycler-adapter file-manager

enter image description here

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

显示现有Recyclerview的代码非常简单。我正在将文件的ArrayList(在根目录中)分配给Recyclerview适配器。

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

如果您选择子文件夹,则可以重置Adapter的数据。

示例:

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

现在,您要列出Path X /示例的文件/文件夹。因此,您始终将当前路径存储在适配器中,并创建一个名为update或类似的方法,其中输入是新路径。然后你更新适配器和瞧!如果用户决定从路径X /示例返回到路径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中“较旧”的fiels的引用,而不是总是替换它们,那么你可以按如下方式调整整个内容:

创建一个包含Path和List fileNames

的类
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 / ActivityRecyclerView存在的任何地方覆盖onBackPressed(),如下所示:

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

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

请记住,一切都是伪代码,直接写在我的脑海里。没有测试或任何东西。应该工作,否则请告诉我,我会编辑我的答案:)