如何更改我的 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。那不会给你你想要的。因为,你已经显示了没有排序的文件,你只需要做一些修改:

  1. 做一个数据class像这样:

    data class MyFile(var file: File, var isNew: Boolean = false)
    
  2. 现在排序部分是这样的:

    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
    } 
    
  3. 现在还有,你可能想获取文件夹而不排序,你可能会有点困惑,所以,这里是获取文件夹的代码

    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)) }
       } 
    }
    

这将为您完成任务。