Android RecyclerView不自动更新,仅滚动时生效的问题求助
解决RecyclerView调用notifyItemChanged后仅滚动才刷新的问题
1. 修复线程错误(核心问题)
你在IO协程里调用RecyclerView的通知方法是错误的——所有UI相关操作必须在主线程执行。修改updateImage方法:
private fun updateImage(moviePosition: Int) { CoroutineScope(Dispatchers.IO).launch { Log.e("a7a", "called") try { SharedVars.allMoviesLoaded = movies // 切回主线程执行UI更新 withContext(Dispatchers.Main) { binding?.rvMoviesToDelete?.adapter?.notifyItemChanged(moviePosition) } } catch (e: Exception) { handleLoadingErrors("updateImg", "$e") } } }
2. 确认数据源与适配器同步
- 检查你更新的
movies集合,和适配器初始化时用的tempArrayList是否为同一个引用。如果是不同集合,要么将movies赋值给适配器内部的数据源,要么调用adapter.submitList(movies)(若使用ListAdapter)。 - 适配器的
onBindViewHolder方法中,必须直接从当前数据源读取最新图片信息,不能依赖缓存的旧值。
3. 解决ScrollView嵌套RecyclerView的布局冲突
ScrollView嵌套RecyclerView会干扰RecyclerView的布局刷新机制,建议:
- 将
ScrollView替换为NestedScrollView,同时给RecyclerView添加以下属性:
<androidx.recyclerview.widget.RecyclerView ... android:nestedScrollingEnabled="false" android:layout_height="wrap_content"/>
- 或者给RecyclerView设置固定高度,避免ScrollView影响其视图更新逻辑。
4. 确保图片加载完成后再触发更新
如果使用Glide/Picasso等库加载Firebase Storage图片,要在图片加载完成的回调中调用updateImage,而非提前触发。以Glide为例:
Glide.with(context) .load(imageUrl) .listener(object : RequestListener<Drawable> { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean { return false } override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { // 图片加载完成后更新RecyclerView updateImage(position) return false } }) .into(imageView)
内容的提问来源于stack exchange,提问作者Mark George
相关产品推荐
相关产品推荐

