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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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 08:31:11

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

您的问题

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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

复制
相关文章
vue子组件传值给父组件_子组件调用父组件中的方法
大家好,又见面了,我是你们的朋友全栈君。 参考视频 : https://www.bilibili.com/video/av32790541/?spm_id_from=trigger_reload 原
全栈程序员站长
2022/10/04
4.2K0
vue子组件传值给父组件_子组件调用父组件中的方法
vue 父组件调用子组件的函数_vue子组件触发父组件方法
项目里将element-ui的el-upload写成公共组件方便调用,官方的before-upload方法用于处理上传前要做的事,如:比较文件大小,限制文件类型等,通过返回true 或 false 控制是否上传。 当该组件调用父组件方法,并且要能获取到父组件方法的返回值,如何实现?
全栈程序员站长
2022/11/10
3K0
vue 父组件调用子组件的方法_vue子组件修改父组件值
我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法
全栈程序员站长
2022/11/09
2K0
子组件传对象给父组件_react子组件改变父组件的状态
sendData = () => { let data = ‘1234’; this.props.getData(data); //这个this,props.xxx 后面的xxx是是在父组件那使用的名字; }, 然后可以在render函数后使用这个方法或者另外定义一个事件去触发该方法进行传值,
全栈程序员站长
2022/10/04
2.8K0
vue子组件调用父组件函数_vue子组件修改父组件值
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
1.7K0
vue父组件中获取子组件中的数据
<FormItem label="上传头像" prop="image"> <uploadImg :width="150" :height="150" :name="'avatar'" size="150px*150px" ref="avatar"></uploadImg> </FormItem> <FormItem label="上传营业执照" prop="businessLicence"> <uploadImg :width="350" :heigh
蓓蕾心晴
2018/04/12
6.9K0
vue父组件调用子组件属性_vue子组件获取父组件实例
但是在vue3中,很显然使用this.$emit() 已经开始报错了,为什么会报错呢?
全栈程序员站长
2022/11/10
2.1K0
vue 父组件调用子组件_react父组件向子组件传值
1.直接在子组件中通过“this.$parent.event”来调用父组件的方法。
全栈程序员站长
2022/11/15
1.9K0
vue中父组件传值给子组件,父组件值改变,子组件不能重新渲染[通俗易懂]
这个方法感觉props’接收数据在调用方法之后,明明父组件的值已经改变了,但是父组件在调用子组件方法时,数据仍然没有 接收到,调用之后才接收到,这个方法暂且没用,应该是声明ref的时候声明的是当前组件的实例,然后调用时调用的也是值未改变时的属性。这个没什么用,可以用来调用子组件方法。
全栈程序员站长
2022/11/16
3K0
react子组件向父组件传递数据_react子组件改变父组件的状态
本博客代码是 React 父组件和子组件相互传值的 demo;实现封装一个折线图,折线图选择下拉框,获取下拉框点击的值并且传给父组件根据下拉框筛选的条件更新视图;效果图如下:
全栈程序员站长
2022/10/03
3.6K0
react子组件向父组件传递数据_react子组件改变父组件的状态
vue父组件引入子组件_vue子组件传递方法给父组件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
我们经常分不清什么是父组件,什么是子组件。现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件。具体代码如下
全栈程序员站长
2022/09/19
7K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
Vuejs中父组件主动调用子组件的方法
我们都知道,vue是单向流,但是有时候我们需要在父组件中主动通知子组件一些信息,使其做出一些响应变化,那么如何在父组件中去主动调用子组件的方法呢?Vue当然给我们提供了方法,如下:
飞奔去旅行
2019/06/13
5K0
react中父组件向子组件传值
子组件中只能使用不能修改父组件传递过来的数据!!!如果非要修改,那就父组件传递一个方法给子组件,子组件使用这个方法来改变父组件中的数据。这就是react的单项数据流(父组件传递给子组件,不可以在子组件中改变)
全栈程序员站长
2022/09/01
2.5K0
vue中父组件向子组件传值
首先在以下案例中,App.vue是父组件,Second-module.vue是子组件。 总体来说,父传子就是这四个步骤:父组件的data中定义值,引入并调用子组件,在引用的子组件的标签上通过v-bind指令给子组件传值,子组件通过在data中定义的props属性接收父组件传过来的值然后应用到子组件里。 首先,值肯定是定义在父组件中的,供所有子组件共享,所以要在父组件的data中定义值:
全栈程序员站长
2022/09/06
1.4K0
vue中父组件向子组件传值
vue中父组件和子组件交互的方式
vue中使用component来表示组件,通过封装组件,我们可以将代码最大程度的复用,可以说组件是vue中的核心。
程序那些事儿
2023/03/07
5.8K0
vue中父组件和子组件交互的方式
angular子组件传值到父组件_vue子组件传值给父组件
step1: D:\vue\untitled2901\src\app\app.component.ts
全栈程序员站长
2022/10/04
2.7K0
react 子组件向父组件传值_vue父组件给子组件传值
父组件给子组件传递数据,直接用属性名传递,子组件通过props获取父组件传递过来的值
全栈程序员站长
2022/10/03
2.8K0
Vue中父组件向子组件传值
Vue中父组件向子组件传值 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.4.0.js"></script> <style> </style> </head> <body> <div id="app"> <!--父组件可以在引用子组件的时候,通过属性绑定的形式(v-bind
Dream城堡
2018/12/06
1.3K0
vue父组件调用子组件方法返回值_vue子组件修改父组件值
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.5K0

相似问题

ReactJS:如何访问父组件中的所有子组件?

12

如何从ReactJs中的父组件访问子组件的输入值?

23

ReactJS:访问组件“父”中的组件

23

ReactJS:访问父级中的子组件属性

14

如何从Reactjs中的子组件更新父组件的组件状态

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文