如何更改我的 recyclerView 项目订单?
How can I change my recyclerView items order?
我想对我的项目进行排序,以便将所选元素放在开头,我创建了一小段代码允许它工作得很好,但是当我在适配器中更新我的数组时,recyclerview 没有改变.我尝试在我的适配器中使用更新功能来完成它,并且通过调试器,我看到传递的数组被修改但视图中没有任何内容......我也尝试在创建适配器时发送我的数组但没有任何变化。更奇怪,因为我还有一个按字母顺序排列的过滤器,效果很好……有人有想法吗?谢谢
这是我的排序代码,我用调试器对其进行了测试:
for (i in 0 until folders.size) {
val isRead: String? = prefNewDir.getString(folders[i].absolutePath, null)
if (isRead != null) {
println("before : "+folders[i] + "et i :" + i)
val old= folders[i]
folders.removeAt(i)
folders.add(0, old)
println("after : "+folders[i] + "et i :" + i)
}
}
这是我在适配器中的更新方法:
fun updateData(data: MutableList<File>) {
println("update before : "+items[0])
items = data
println("update after : "+items[0])
notifyDataSetChanged()
}
这是我的适配器代码:
class DirAdapter(
private val context: Context,
private var items: MutableList<File>,
) : RecyclerView.Adapter<DirAdapter.DirViewHolder>() {
private val prefNewDir: SharedPreferences = context.getSharedPreferences("new_files", Context.MODE_PRIVATE)
class DirViewHolder(view : View) : RecyclerView.ViewHolder(view) {
val Dir_name = view.findViewById<TextView>(R.id.file_name)
val DirIsRead = view.findViewById<ImageView>(R.id.file_new)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType : Int):DirViewHolder{
val view : View = LayoutInflater.from(parent.context) //Mode dossier
.inflate(R.layout.folder_element, parent, false)
return DirViewHolder(view)
}
fun updateData(data: MutableList<File>) {
println("update data : "+items[0])
items = data
println("update data : "+items[0])
notifyDataSetChanged()
}
override fun onBindViewHolder(holder: DirViewHolder, position: Int) {
val currentDir = items[position]
holder.Dir_name.text = currentDir.name
val isRead: String? = prefNewDir.getString(currentDir.absolutePath, null) // On recupere si oui ou non le fichier est lu
if (isRead!=null) {
holder.DirIsRead.visibility = View.VISIBLE
} else
holder.DirIsRead.visibility = View.GONE
holder.itemView.setOnClickListener {
val intent = Intent(context, FilesActivity::class.java)
intent.putExtra("path",currentDir.absolutePath)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
holder.itemView.setOnLongClickListener {
val popupMenu = PopupMenu(context, it)
if (isRead != null) { //Popup seulement sur un element
popupMenu.menu.add("Marquer comme lu")
}
popupMenu.setOnMenuItemClickListener {
if (it.title == "Marquer comme lu") {
putFolderAsRead(currentDir)
holder.DirIsRead.visibility = View.GONE
}
true
}
popupMenu.show()
true
}
}
private fun putFolderAsRead(folder: File) {
val editor: SharedPreferences.Editor = prefNewDir.edit()
editor.remove(folder.absolutePath)
//Dossier courant
val folderList = folder.listFiles()
for (dListItem in folderList) {
if(dListItem.isDirectory) //Si un dossier est present on reboucle dessus
putFolderAsRead(dListItem)
editor.remove(dListItem.absolutePath)
println(dListItem.absolutePath + " Marque comme lu !")
}
editor.apply()
}
override fun getItemCount() = items.size
}
首先,为了在共享首选项中存储数据,我希望您使用我的库 here。您可以参考文档以了解其工作原理。另外,我希望您使用 data class
而不是文件 class。那不会给你你想要的。因为,你已经显示了没有排序的文件,你只需要做一些修改:
做一个数据class像这样:
data class MyFile(var file: File, var isNew: Boolean = false)
现在排序部分是这样的:
var folders = getFolders(Environment.getExternalStorageDirectory())
for (i in 0 until folders.size) {
val isRead: String? = prefNewDir.getString(folders[i].absolutePath, null)
folders.get(i).isNew = if(isRead == null) false else true
}
现在还有,你可能想获取文件夹而不排序,你可能会有点困惑,所以,这里是获取文件夹的代码
fun getFolders(location:File) : ArrayList<MyFile>(){
val files = location.listFile()
var foldersList = ArrayList<MyFile>()
for (file in files) {
if(file.isDirectory){ foldersList.add(MyFile(file)) }
}
}
这将为您完成任务。
我想对我的项目进行排序,以便将所选元素放在开头,我创建了一小段代码允许它工作得很好,但是当我在适配器中更新我的数组时,recyclerview 没有改变.我尝试在我的适配器中使用更新功能来完成它,并且通过调试器,我看到传递的数组被修改但视图中没有任何内容......我也尝试在创建适配器时发送我的数组但没有任何变化。更奇怪,因为我还有一个按字母顺序排列的过滤器,效果很好……有人有想法吗?谢谢
这是我的排序代码,我用调试器对其进行了测试:
for (i in 0 until folders.size) {
val isRead: String? = prefNewDir.getString(folders[i].absolutePath, null)
if (isRead != null) {
println("before : "+folders[i] + "et i :" + i)
val old= folders[i]
folders.removeAt(i)
folders.add(0, old)
println("after : "+folders[i] + "et i :" + i)
}
}
这是我在适配器中的更新方法:
fun updateData(data: MutableList<File>) {
println("update before : "+items[0])
items = data
println("update after : "+items[0])
notifyDataSetChanged()
}
这是我的适配器代码:
class DirAdapter(
private val context: Context,
private var items: MutableList<File>,
) : RecyclerView.Adapter<DirAdapter.DirViewHolder>() {
private val prefNewDir: SharedPreferences = context.getSharedPreferences("new_files", Context.MODE_PRIVATE)
class DirViewHolder(view : View) : RecyclerView.ViewHolder(view) {
val Dir_name = view.findViewById<TextView>(R.id.file_name)
val DirIsRead = view.findViewById<ImageView>(R.id.file_new)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType : Int):DirViewHolder{
val view : View = LayoutInflater.from(parent.context) //Mode dossier
.inflate(R.layout.folder_element, parent, false)
return DirViewHolder(view)
}
fun updateData(data: MutableList<File>) {
println("update data : "+items[0])
items = data
println("update data : "+items[0])
notifyDataSetChanged()
}
override fun onBindViewHolder(holder: DirViewHolder, position: Int) {
val currentDir = items[position]
holder.Dir_name.text = currentDir.name
val isRead: String? = prefNewDir.getString(currentDir.absolutePath, null) // On recupere si oui ou non le fichier est lu
if (isRead!=null) {
holder.DirIsRead.visibility = View.VISIBLE
} else
holder.DirIsRead.visibility = View.GONE
holder.itemView.setOnClickListener {
val intent = Intent(context, FilesActivity::class.java)
intent.putExtra("path",currentDir.absolutePath)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
holder.itemView.setOnLongClickListener {
val popupMenu = PopupMenu(context, it)
if (isRead != null) { //Popup seulement sur un element
popupMenu.menu.add("Marquer comme lu")
}
popupMenu.setOnMenuItemClickListener {
if (it.title == "Marquer comme lu") {
putFolderAsRead(currentDir)
holder.DirIsRead.visibility = View.GONE
}
true
}
popupMenu.show()
true
}
}
private fun putFolderAsRead(folder: File) {
val editor: SharedPreferences.Editor = prefNewDir.edit()
editor.remove(folder.absolutePath)
//Dossier courant
val folderList = folder.listFiles()
for (dListItem in folderList) {
if(dListItem.isDirectory) //Si un dossier est present on reboucle dessus
putFolderAsRead(dListItem)
editor.remove(dListItem.absolutePath)
println(dListItem.absolutePath + " Marque comme lu !")
}
editor.apply()
}
override fun getItemCount() = items.size
}
首先,为了在共享首选项中存储数据,我希望您使用我的库 here。您可以参考文档以了解其工作原理。另外,我希望您使用 data class
而不是文件 class。那不会给你你想要的。因为,你已经显示了没有排序的文件,你只需要做一些修改:
做一个数据class像这样:
data class MyFile(var file: File, var isNew: Boolean = false)
现在排序部分是这样的:
var folders = getFolders(Environment.getExternalStorageDirectory()) for (i in 0 until folders.size) { val isRead: String? = prefNewDir.getString(folders[i].absolutePath, null) folders.get(i).isNew = if(isRead == null) false else true }
现在还有,你可能想获取文件夹而不排序,你可能会有点困惑,所以,这里是获取文件夹的代码
fun getFolders(location:File) : ArrayList<MyFile>(){ val files = location.listFile() var foldersList = ArrayList<MyFile>() for (file in files) { if(file.isDirectory){ foldersList.add(MyFile(file)) } } }
这将为您完成任务。