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

RecyclerView中Glide占位符应用内切换深浅主题未生效问题

问题原因

不是Glide占位符不支持应用内动态主题适配,是你的实现流程存在两处缺失:

  1. 手动切换应用主题后未主动触发RecyclerView列表项重新绑定,BindingAdapter不会重新执行,Glide不会重新发起图片加载请求,占位符仍是切换主题前的旧版本。
  2. 已渲染到ImageView上的矢量图占位符,其中的颜色引用是在首次解析时就转换成了实际色值,不会自动监听主题变更触发重绘。

修复方案

1. 主题切换后触发列表刷新

在三套主题切换的代码执行完成后,主动通知RecyclerView适配器刷新,触发列表项重新走数据绑定逻辑:

// 示例:切换浅色主题逻辑末尾添加刷新代码
sortView.findViewById<ConstraintLayout>(R.id.lyt_light_theme).setOnClickListener {
    storageViewModel.changeTheme(resources.getString(R.string.light))
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    // 新增:刷新列表
    rcv_all_songs.adapter?.notifyDataSetChanged()
    builder.dismiss()
}

如果追求性能可以仅刷新当前可见的列表项,无需全量刷新。

2. 调整BindingAdapter占位符加载逻辑

不要直接给Glide的placeholder方法传入资源ID,改为每次加载前主动用当前上下文解析占位符drawable,确保拿到的是对应当前主题的资源版本:

@BindingAdapter("app:albumId", "app:recycled", "app:blurred", requireAll = false)
fun setAlbumId(
view: ImageView,
albumId: Long,
recycled: Boolean = false,
blurred: Boolean = false)
{
view.clipToOutline = true
val uri = ContentUris.withAppendedId(ARTWORK_URI, albumId)
// 主动用最新上下文解析占位符
val themePlaceholder = ContextCompat.getDrawable(view.context, R.drawable.ic_default_album_art)
Glide
  .with(view)
  .load(uri)
  .placeholder(themePlaceholder)
  .transform(CenterCrop(), RoundedCorners(8))
  .into(view)
}

3. 检查Activity配置(可选)

如果你在Manifest中给对应Activity配置了android:configChanges="uiMode",需要重写onConfigurationChanged方法手动触发视图更新,否则系统不会自动触发资源重载。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:03