首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何访问片段中回收视图中每个项目的共享首选项

如何访问片段中回收视图中每个项目的共享首选项
EN

Stack Overflow用户
提问于 2021-05-25 15:21:52
回答 1查看 795关注 0票数 0

我希望将按钮的共享首选项存储在片段使用的回收视图适配器中。

代码语言:javascript
代码运行次数:0
运行
复制
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, 2021",
    "07:00 19th May, 2021", "04:00 20th May, 2021",
    "01:00 21th May, 2021", "10:00 21th May, 2021",
    "20:00 27th May, 2021", "10:00 30th May, 2021")

private val btn = arrayOf(false, false, false, false, false, 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
    }
}

使用此适配器的片段

代码语言:javascript
代码运行次数:0
运行
复制
class AvailableWorkshops : Fragment() {

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_available_workshops, container, false)
}

override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) {
    super.onViewCreated(itemView, savedInstanceState)
    val recyclerView = itemView.findViewById<RecyclerView>(R.id.recycler_view)
    recyclerView.apply {
        // set a LinearLayoutManager to handle Android
        // RecyclerView behavior
        layoutManager = LinearLayoutManager(activity)
        // set the custom adapter to the RecyclerView
        adapter = RecyclerViewAdapter()
        }
    }
}

例如,这个适配器中有8项,我单击第5项,它将调用onClickListener()并更改按钮属性,这是完全正确的。

但是,当我们重新启动应用程序时,将更改为默认按钮属性(共享首选项无法工作)

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-25 16:31:11

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

您的问题

ViewHolder表示RecyclerView中的一个项。初始化ViewHolder时,要将首选项应用到相同的按钮7次。

代码语言:javascript
代码运行次数:0
运行
复制
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()
            }
        }

    }

A解决方案

删除init块中的ViewHolder,并将隐藏/显示逻辑移动到设置每个实例的onBindViewHolder方法。

代码语言:javascript
代码运行次数:0
运行
复制
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()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67690973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档