You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加SharedPreferences数据后RecyclerView不实时更新,重启才显示求助

问题分析与修复方案

核心问题

  1. SharedPreferences存储逻辑错误:你用固定的text和isChecked键存储数据,每次点击添加都会覆盖之前的内容,永远只能保存一条记录。
  2. 列表更新逻辑位置错误:更新RecyclerView和添加数据到列表的代码写在了初始化阶段,而非按钮点击的回调中,导致点击添加后列表完全没触发更新。
  3. 空指针风险:直接用title!!强制解包,首次启动App时title为null会直接崩溃。

修复后的完整代码示例

// 在类内声明全局变量
private lateinit var myAdapter: RecyclerviewAdepter
private val noteList = mutableListOf<NoteModel>()
private lateinit var sharedPref: SharedPreferences

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    sharedPref = getSharedPreferences("pref", MODE_PRIVATE)
    // 初始化时加载所有历史笔记
    loadSavedNotes()

    myAdapter = RecyclerviewAdepter(noteList)
    binding.recyclerView.adapter = myAdapter

    binding.btAdd.setOnClickListener {
        val inputText = binding.editText.text.toString().trim()
        if (inputText.isEmpty()) {
            return@setOnClickListener // 空内容不添加
        }
        val isChecked = binding.isCheckbox.isChecked

        // 1. 先更新本地列表和RecyclerView
        val newNote = NoteModel(inputText, isChecked)
        noteList.add(newNote)
        myAdapter.notifyItemInserted(noteList.size - 1) // 只刷新新增条目,效率更高

        // 2. 再将整个列表保存到SharedPreferences
        saveNotesToSP()

        // 重置输入控件状态
        binding.editText.setText("")
        binding.isCheckbox.isChecked = false
    }
}

// 从SharedPreferences加载所有笔记
private fun loadSavedNotes() {
    val jsonStr = sharedPref.getString("notes_list", null)
    if (!jsonStr.isNullOrEmpty()) {
        // 用Gson解析JSON字符串为列表,需先添加Gson依赖
        val gson = Gson()
        val listType = object : TypeToken<MutableList<NoteModel>>() {}.type
        val savedNotes = gson.fromJson<MutableList<NoteModel>>(jsonStr, listType)
        noteList.addAll(savedNotes)
    }
}

// 将列表序列化为JSON字符串保存到SharedPreferences
private fun saveNotesToSP() {
    val gson = Gson()
    val jsonStr = gson.toJson(noteList)
    sharedPref.edit()
        .putString("notes_list", jsonStr)
        .apply()
}

关键修复说明

  • 多数据存储方案:通过Gson把整个列表序列化为JSON字符串存储,避免单条数据覆盖问题。需在build.gradle中添加Gson依赖:implementation 'com.google.code.gson:gson:2.10.1'。
  • 实时刷新列表:在按钮点击回调内完成「添加数据到列表→通知RecyclerView更新」的逻辑,这是实现实时刷新的核心。
  • 初始化加载历史数据:启动App时从SharedPreferences读取所有历史笔记,保证重启后能看到全部记录。
  • 空值与合法性校验:添加输入内容非空判断,去掉强制解包!!,避免空指针崩溃。

内容的提问来源于stack exchange,提问作者mohamet amin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:54:52