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

动态加载数据到ListPreference后摘要无法持久化问题

ListPreference返回设置页面后摘要重置为null的解决方法

问题情况

在SettingActivity中,从Room加载数据展示到ListPreference,选择列表项后值能正确保存到SharedPreferences,摘要也能正常显示,但返回SettingActivity后摘要会重置为null。

问题原因

每次回到SettingActivity时,LiveData会重新触发并设置ListPreference的entries和entryValues,但此时没有根据已保存的选中值重新设置摘要,导致摘要丢失。

解决方法

修改setShopsPreferences方法,在设置完entries和entryValues后,手动根据SharedPreferences中保存的值更新摘要:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    viewModel.shops.observe(viewLifecycleOwner) {
        setShopsPreferences(it)
    }
}

private fun setShopsPreferences(shops: List<Shop>) {
    val shopsPreference = preferenceManager.findPreference<ListPreference>("defaultShop")
    if (shops.isEmpty()) {
        shopsPreference?.isEnabled = false
        shopsPreference?.summary = "暂无可用店铺" // 空数据时可设置提示摘要
        return
    } else {
        shopsPreference?.isEnabled = true
    }

    val entries: ArrayList<String> = ArrayList()
    val entryValues: ArrayList<String> = ArrayList()

    shops.forEach {
        entries.add(it.description)
        entryValues.add(it.id)
    }

    shopsPreference?.entryValues = entryValues.toArray(arrayOfNulls<CharSequence>(entryValues.size))
    shopsPreference?.entries = entries.toArray(arrayOfNulls<CharSequence>(entries.size))

    // 关键:根据已保存的值重新设置摘要
    val sharedPref = preferenceManager.sharedPreferences
    val selectedValue = sharedPref.getString("defaultShop", "")
    val selectedIndex = entryValues.indexOf(selectedValue)
    if (selectedIndex != -1) {
        shopsPreference?.summary = entries[selectedIndex]
    }
}

另外,原ViewModel中的observeForever存在内存泄漏风险,建议简化ViewModel代码:

@HiltViewModel
class ShopsViewModel @Inject constructor(repository: ShopsRepository) : ViewModel() {
    val shops: LiveData<List<Shop>> = repository.getAllShops()
}

这样既简洁又能让LiveData被viewLifecycleOwner正确管理,避免内存泄漏。

修改后,每次回到SettingActivity触发LiveData回调时,都会根据已保存的选中值重新设置摘要,解决返回后摘要重置为null的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:01:23