1、获取指定路径下所有文件
val fileDir = File(path)
if (fileDir.exists()) {
files = fileDir.walk()
.filter { it.isFile }
.toList()
} else {
LogAct.e(TAG, "Directory does not exist")
}
2、将结果显示到RecyclerView
adapter = files?.let { FilesAdapter(mContext, it) }
rv_select_file.adapter = adapter
rv_select_file.layoutManager = LinearLayoutManager(context)
class FilesAdapter(val context: Context, private val files: List<File>) :
RecyclerView.Adapter<FilesAdapter.FilesViewHolder>() {
private lateinit var filesViewHolder: FilesViewHolder
inner class FilesViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var cb_select_file_item: CheckBox = view.findViewById(R.id.cb_select_file_item)
}
override fun getItemCount(): Int {
return files.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilesViewHolder {
val itemView = LayoutInflater.from(context)
.inflate(R.layout.select_file_recycler_list, parent, false)
filesViewHolder = FilesViewHolder(itemView)
filesViewHolder.setIsRecyclable(false)
return filesViewHolder
}
@SuppressLint("SetTextI18n", "NotifyDataSetChanged")
override fun onBindViewHolder(holder: FilesViewHolder, position: Int) {
holder.cb_select_file_item.text = "${position + 1}:${files[position].name}"
}
}
3、选中项高亮
// 使用CheckBox控件 选中状态下设置高亮背景色
if(selectPosition == position){
holder.cb_select_file_item.isChecked = true
}else {
holder.cb_select_file_item.isSelected = false
}
holder.cb_select_file_item.setOnCheckedChangeListener { _, isCheck ->
if (isCheck){
selectPosition = position
notifyDataSetChanged()
}
}
4、总结
private var files: List<File>? = null
val fileDir = File(path)
if (fileDir.exists()) {
files = fileDir.walk()
.filter { it.isFile }
.toList() // files为该目录下文件集合
adapter = files?.let { FilesAdapter(mContext, it) }
rv_select_file.adapter = adapter
rv_select_file.layoutManager = LinearLayoutManager(context)
} else {
LogAct.e(TAG, "Directory does not exist")
}
class FilesAdapter(val context: Context, private val files: List<File>) :
RecyclerView.Adapter<FilesAdapter.FilesViewHolder>() {
private lateinit var filesViewHolder: FilesViewHolder
inner class FilesViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var cb_select_file_item: CheckBox = view.findViewById(R.id.cb_select_file_item)
}
override fun getItemCount(): Int {
return files.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilesViewHolder {
val itemView = LayoutInflater.from(context)
.inflate(R.layout.select_file_recycler_list, parent, false)
filesViewHolder = FilesViewHolder(itemView)
filesViewHolder.setIsRecyclable(false)
return filesViewHolder
}
@SuppressLint("SetTextI18n", "NotifyDataSetChanged")
override fun onBindViewHolder(holder: FilesViewHolder, position: Int) {
holder.cb_select_file_item.text = "${position + 1}:${files[position].name}" // files[position].name 文件名称
if(selectPosition == position){
holder.cb_select_file_item.isChecked = true
}else {
holder.cb_select_file_item.isSelected = false
}
holder.cb_select_file_item.setOnCheckedChangeListener { _, isCheck ->
if (isCheck){
selectPosition = position // selectPosition 将选中项传递出去
notifyDataSetChanged()
}
}
}
}