RecyclerView中Glide占位符应用内切换深浅主题未生效问题
问题原因
不是Glide占位符不支持应用内动态主题适配,是你的实现流程存在两处缺失:
- 手动切换应用主题后未主动触发RecyclerView列表项重新绑定,BindingAdapter不会重新执行,Glide不会重新发起图片加载请求,占位符仍是切换主题前的旧版本。
- 已渲染到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
相关产品推荐
相关产品推荐

