如何在 Fragment 的 Recycler View 中访问每个项目的共享首选项

如何解决如何在 Fragment 的 Recycler View 中访问每个项目的共享首选项

我想在 Fragment 使用的 Recycler View Adapter 中存储按钮的共享首选项。

C:/SDL2-w64/lib/libSDL2main.a(SDL_windows_main.o): In function `main_getcmdline':
/Users/valve/release/SDL/SDL2-2.0.14-source/foo-x64/../src/main/windows/SDL_windows_main.c:71: undefined reference to `SDL_main'
collect2.exe: error: ld returned 1 exit status
C:/SDL2-w64/lib/libSDL2main.a(SDL_windows_main.o): In function `main_getcmdline':
/Users/valve/release/SDL/SDL2-2.0.14-source/foo-x64/../src/main/windows/SDL_windows_main.c:71: undefined reference to `SDL_main'
[Finished in 5.4s]

正在使用这个适配器的片段

class RecyclerViewAdapter : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {

private val name = arrayOf("Android Dev W1","Android Dev W2","Web Dev W1","Learn Kotlin B1","Android Dev W3","Android Dev W4","Web Dev W2","Learn DSA")

private val date = arrayOf("20:00 18th May,2021","04:00 18th May,"07:00 19th May,"04:00 20th May,"01:00 21th May,"10:00 21th May,"20:00 27th May,"10:00 30th May,2021")

private val btn = arrayOf(false,false,false)

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    var itemName: TextView = itemView.findViewById(R.id.workshopName)
    var itemDate: TextView = itemView.findViewById(R.id.workshopDate)
    var button: Button = itemView.findViewById(R.id.applyBtn)

    val prefs = itemView.context.getSharedPreferences("prefs",MODE_PRIVATE)

    init {

        for(i in 0 .. 7) {
            //checking via sharedPreferences if this app is being run first time or not
            btn[i] = prefs.getBoolean("registered$i",false)
            if (btn[i]) {
                hideButton()
            } else {
                showButton()
            }
        }

    }

     fun hideButton() {
         button.text = "Applied"
         button.isClickable = false
         button.setBackgroundColor(Color.parseColor("#FF3700E9"))
    }

    private fun showButton() {
        button.text = "Apply"
        button.isClickable = true
        button.setBackgroundColor(Color.parseColor("#FF6200EE"))
    }
}

override fun onCreateViewHolder(viewGroup: ViewGroup,i: Int): ViewHolder {
    val v = LayoutInflater.from(viewGroup.context)
        .inflate(R.layout.frame_textview,viewGroup,false)
    return ViewHolder(v)
}

override fun onBindViewHolder(viewHolder: ViewHolder,i: Int) {
    viewHolder.itemName.text = name[i]
    viewHolder.itemDate.text = date[i]
    viewHolder.button.setonClickListener {
        viewHolder.prefs.edit().putBoolean("registered$i",true).apply()
        btn[i] = true
        viewHolder.hideButton()
    }

}

override fun getItemCount(): Int {
        return name.size
    }
}

例如,此适配器中有 8 个项目,我单击第 5 个项目,它将调用 onClickListener() 并更改完全没问题的按钮属性

但是,当我们重新启动应用程序时会更改回认按钮属性(共享首选项不起作用)

同样,如果我点击每个项目并重新启动应用程序,它现在将显示每个项目的新更改(共享首选项在这里工作)。

如果我点击第 5 个项目,我想存储它,然后在应用程序重新启动时它应该只更改第 5 个项目的显示,而不是每个项目。

解决方法

如果我点击第 5 个项目,我想存储它,然后在应用程序重新启动时它应该只更改第 5 个项目的显示,而不是每个项目。

你的问题

ViewHolder 代表 RecyclerView 中的一项。当您初始化 ViewHolder 时,您会将首选项应用 7 次到同一个按钮

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
  
 //...

 init {
        // ** THIS IS NOT HIDING OR SHOWING SEVEN DIFFERENT BUTTONS - THIS IS HIDING OR
        // SHOWING THIS VIEWHOLDER'S ONE BUTTON SEVEN TIMES **

        for(i in 0 .. 7) {
            //checking via sharedPreferences if this app is being run first time or not
            btn[i] = prefs.getBoolean("registered$i",false)
            if (btn[i]) {
                hideButton()
            } else {
                showButton()
            }
        }

    }

解决方案

删除 init 中的 ViewHolder 块,并将隐藏/显示逻辑移至 onBindViewHolder 方法,您可以在其中设置每个单个实例。 >

override fun onBindViewHolder(viewHolder: ViewHolder,i: Int) {
    viewHolder.itemName.text = name[i]
    viewHolder.itemDate.text = date[i]

    // ** SHOW OR HIDE THIS INSTANCE'S BUTTON - AND ONLY THIS INSTANCE'S BUTTON **
    if (viewHolder.prefs.getBoolean("registered$i",false)) {
        viewHolder.hideButton()
    } else {
        viewHolder.showButton()
    }

    viewHolder.button.setOnClickListener {
        viewHolder.prefs.edit().putBoolean("registered$i",true).apply()
        btn[i] = true
        viewHolder.hideButton()
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?