如果你选择一个子文件夹,你可以重置Adapter的数据。
例子:
现在您想列出路径 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(否则您将无法退出此视图)。
请记住,所有内容都是伪代码,是我直接写的。没有测试什么的。不过应该可以,否则请告诉我,我会编辑我的答案:)