添加SharedPreferences数据后RecyclerView不实时更新,重启才显示求助
问题分析与修复方案
核心问题
- SharedPreferences存储逻辑错误:你用固定的
text和isChecked键存储数据,每次点击添加都会覆盖之前的内容,永远只能保存一条记录。 - 列表更新逻辑位置错误:更新RecyclerView和添加数据到列表的代码写在了初始化阶段,而非按钮点击的回调中,导致点击添加后列表完全没触发更新。
- 空指针风险:直接用
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
相关产品推荐
相关产品推荐

