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

如何在Kotlin的RecyclerView中从SharedPreferences修改TextView字体大小?

实现从SharedPreferences修改RecyclerView内TextView字体大小的方案

1. 保存字体大小(放在设置界面的Activity/Fragment中)

当用户通过控件(比如SeekBar、下拉选择框)确定字体大小后,调用你已有的SaveData类保存数值,同时要通知RecyclerView所在页面刷新列表,让新字体大小生效。

示例代码(以SeekBar为例):

// 假设设置页面的SeekBar范围对应12sp到24sp的字体大小
fontSizeSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
    override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
        val selectedFontSize = 12f + progress // 换算成实际sp值
        SaveData(this@SettingsActivity).setFontSize(selectedFontSize)
        
        // 如果RecyclerView和SeekBar在同一个页面,直接刷新Adapter
        recyclerViewAdapter?.notifyDataSetChanged()
    }

    override fun onStartTrackingTouch(seekBar: SeekBar?) {}
    override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})

2. 加载并应用字体大小(放在RecyclerView的Adapter中)

在Adapter绑定item的逻辑里,读取SharedPreferences中保存的字体大小,直接设置给对应的TextView。同时要处理默认值(你当前默认是0f),给个合理的默认字体大小(比如16sp)。

优化后的Adapter示例:

class MyAdapter(private val dataList: List<String>, private val context: Context) :
    RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    // 只初始化一次SaveData,避免每次绑定都创建实例
    private val saveData = SaveData(context)

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val contentTv: TextView = itemView.findViewById(R.id.tv_content)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val content = dataList[position]
        holder.contentTv.text = content
        
        // 读取保存的字体大小,设置默认值
        val fontSize = saveData.loadFontSize()
        holder.contentTv.textSize = if (fontSize == 0f) 16f else fontSize
    }

    override fun getItemCount(): Int = dataList.size
}

3. 跨页面修改后的刷新逻辑

如果字体大小是在单独的设置页面修改的,修改完成后需要通知RecyclerView所在页面刷新Adapter,常用两种方式:

  • ViewModel共享数据:定义一个ViewModel,用LiveData发送刷新通知,RecyclerView页面监听后调用adapter.notifyDataSetChanged()
  • 本地广播:设置页面发送广播,RecyclerView页面接收广播后触发列表刷新

以ViewModel为例的核心代码:

// 共享ViewModel
class FontSizeViewModel : ViewModel() {
    val fontSizeChanged = MutableLiveData<Boolean>()

    fun notifyRefresh() {
        fontSizeChanged.postValue(true)
    }
}

// 设置页面保存字体后调用
viewModel.notifyRefresh()

// RecyclerView页面监听
viewModel.fontSizeChanged.observe(this) {
    recyclerViewAdapter.notifyDataSetChanged()
}

注意事项

  • 保存字体大小时建议用sp单位,和TextView的textSize默认单位一致,适配不同屏幕分辨率
  • 避免在onBindViewHolder里重复创建SaveData实例,直接作为Adapter成员变量初始化一次即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:10:42