Kotlin Android RecyclerView适配器:文件路径搜索及多类型内容获取问题
Kotlin实现全文件/文件夹展示+搜索功能
一、获取所有文件夹与各类文件
你之前仅能获取images/*类型内容,是因为限制了文件过滤条件。要获取目录下所有内容,直接遍历目标目录的所有子项即可,同时区分文件夹和文件方便RecyclerView适配:
- 定义封装类区分文件与文件夹(替代直接使用File类,更易扩展)
sealed class FileItem { data class Folder(val file: File) : FileItem() // 文件夹类型 data class Document(val file: File) : FileItem() // 文件类型 }
- 遍历目标目录,转换为FileItem列表
// 示例:获取外部存储根目录下的所有内容 val targetDir = File(Environment.getExternalStorageDirectory().absolutePath) val rawFileList = targetDir.listFiles()?.toMutableList() ?: mutableListOf() // 转换为区分类型的FileItem列表 val fileItems = rawFileList.map { file -> if (file.isDirectory) { FileItem.Folder(file) } else { FileItem.Document(file) } }
注意:Android 6.0+需要动态申请
READ_EXTERNAL_STORAGE权限;Android 10+若使用分区存储,访问公共目录需申请MANAGE_EXTERNAL_STORAGE权限,或改用MediaStore API适配。
二、实现搜索功能
基于封装的FileItem列表,直接通过关键词过滤即可,和操作普通模型类逻辑一致:
- 编写搜索过滤函数
fun filterFileList(keyword: String, originalList: List<FileItem>): List<FileItem> { return originalList.filter { item -> // 匹配文件名,忽略大小写 val fileName = when(item) { is FileItem.Folder -> item.file.name is FileItem.Document -> item.file.name } fileName.contains(keyword, ignoreCase = true) } }
- 绑定搜索框监听,更新RecyclerView数据
searchEt.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable?) { val inputKeyword = s.toString().trim() val filteredList = if (inputKeyword.isEmpty()) { originalFileItems // 关键词为空时显示全量列表 } else { filterFileList(inputKeyword, originalFileItems) } // 假设你的Adapter使用ListAdapter,调用submitList更新数据 fileAdapter.submitList(filteredList) } })
- 扩展搜索(可选)
如果需要按文件类型搜索,可在过滤条件中增加扩展名判断:
// 示例:只搜索图片文件 fun filterImageFiles(keyword: String, originalList: List<FileItem>): List<FileItem> { val imageExtensions = setOf("jpg", "jpeg", "png", "gif") return originalList.filter { item -> if (item is FileItem.Document) { val ext = item.file.extension.lowercase() ext in imageExtensions && item.file.name.contains(keyword, ignoreCase = true) } else { false // 不搜索文件夹 } } }
内容的提问来源于stack exchange,提问作者Wangu Ngalati
相关产品推荐
相关产品推荐

