如何用所选目录的文件替换 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 中的现有内容?的主要内容,如果未能解决你的问题,请参考以下文章