You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Android RecyclerView适配器:文件路径搜索及多类型内容获取问题

Kotlin实现全文件/文件夹展示+搜索功能

一、获取所有文件夹与各类文件

你之前仅能获取images/*类型内容,是因为限制了文件过滤条件。要获取目录下所有内容,直接遍历目标目录的所有子项即可,同时区分文件夹和文件方便RecyclerView适配:

  1. 定义封装类区分文件与文件夹(替代直接使用File类,更易扩展)
sealed class FileItem {
    data class Folder(val file: File) : FileItem() // 文件夹类型
    data class Document(val file: File) : FileItem() // 文件类型
}
  1. 遍历目标目录,转换为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列表,直接通过关键词过滤即可,和操作普通模型类逻辑一致:

  1. 编写搜索过滤函数
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)
    }
}
  1. 绑定搜索框监听,更新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)
    }
})
  1. 扩展搜索(可选)
    如果需要按文件类型搜索,可在过滤条件中增加扩展名判断:
// 示例:只搜索图片文件
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:24:15