我如何更改回收口项订单?

发布于 2025-01-27 10:34:30 字数 3875 浏览 3 评论 0原文

我想对项目进行排序,以便将其放置在一开始选择的元素上,我创建了一个允许它的一小部分代码,但是当我在适配器中更新数组时,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
}

I would like to sort my items in order to put at the beginning chosen elements, I created a small piece of code allowing it which works rather well, but when I update my array in the adapter, the recyclerview is unchanged. I tried to do it with an update function in my adapter, and with the debugger, I see that the passed array is modified but nothing in the view... I also tried to send my array when creating the adapter but nothing changes. More weird, because I also have a filter by alphabetical order which works well.... Anyone have an idea? Thanks

Here's is my sort code which work, I tested it with the debugger:

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

Here my update method in my adapter:

fun updateData(data: MutableList<File>) {
    println("update before : "+items[0])
    items = data
    println("update after : "+items[0])

    notifyDataSetChanged()
}

Here's my adapter code:

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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧梦荧光笔 2025-02-03 10:34:30

首先,对于将​​数据存储在共享的首选项中,我希望您使用我的库在这里。您可以转介文档以查看其工作原理。另外,我希望您使用数据类而不是文件类。那不会给你想要的东西。由于您已经不用排序显示文件,因此您只需要一些修改:

  1. 进行类似的数据类:

     数据类myfile(var file:file,var isnew:var isNew:boolean = false)
     
  2. 现在,排序零件将是这样:


    for(i in 0直到文件夹。大小){
    val isRead:字符串? = prefnewdir.getString(文件夹[i] .absolutepath,null)

    文件夹。get(i).isnew = if(isread == null)fresse否则
    }

  3. 现在,您也可能需要在不进行排序的情况下获取文件夹,因此您可能会有些困惑,因此,这是获取文件夹的代码

      fun getFolders(位置:文件):arraylist&lt; myfile&gt;(){
       val files = location.listfile()
       var folderslist = arrayList&lt; myfile&gt;()
       对于(文件中的文件){
          if(file.isdirectory){folderslist.add(myfile(file))}
       } 
    }
     

这将为您完成任务。

First of all for storing data in shared preferences, I'd prefer you to use my library here. You can refer the docs to see how it works. Also, I'd prefer you to use a data class instead of the File class. That won't give you what you want. Since, you already show the files without sort, you just need some modifications:

  1. Make a data class like this:

    data class MyFile(var file: File, var isNew: Boolean = false)
    
  2. Now, the sorting part will be like this:

    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. Now also, you might want to get the folder without sorting and you might be a bit confused, so, here is the code for getting the folders

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

This will do the task for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文