Android实战-RecyclerView+Glide刷新列表的若干bug

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

前言

最近在项目中使用RecyclerView+Glide发现了一些bug,在此记录一下。

一. RecyclerView中使用Glide出现加载图片闪烁

1.1 发现问题

Recycler+Glide图片闪烁问题
如上图所示,在使用RecyclerView+Glide的时候会出现,图片多次叠加的问题。首先看下代码:

// 用了BaseQuickAdapter
@Override
protected void convert(BaseViewHolder holder, Bean bean) {
   
   
	// loading加载
	final View loading = holder.getView(R.id.loading);
    loading.setVisibility(View.VISIBLE);
    // 省略业务代码...
	Glide.with(getContext())
          .load(url) // 加载数据的URL
          .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) // 图片使用原始尺寸
          .into(new SimpleTarget<Drawable>() {
   
    // SimpleTarget已经过时
               		@Override
                public void onResourceReady(@NonNull Drawable resource, 
                							@Nullable Transition<? super Drawable> transition)
          		{
   
   
					 // 图片加载完成就隐藏loading                	
                     loading.setVisibility(View.GONE); 
                     imageView.setImageDrawable(resource);
                 }
     		});
}

由于业务上要求需要显示loading,目前所做的是将loading的View置于ImageView下面,如果图片加载完成,那么就需要将loading给隐藏。
经过分析,之所以会上面图片所示的问题,主要还是由于RecyclerView的复用机制导致的。当我快速滑动到顶部的时候,顶部的那些View是复用被移出列表的itemView,但是这些被复用的itemView可能还在加载之前的数据,同时这些itemView还要加载当前位置上需要加载的数据,这就导致加载的时候会先出现被复用之前需要加载的数据,然后再加载复用之后需要加载的数据。

如果将上面的SimpleTarget改为直接into(imageView),就不会出现该问题!那么为什么会出现这种情况呢?

1.2 查看源码

首先看一下Glide在直接into的时候做了啥?
Glide源码:

  @NonNull
  public ViewTarget<ImageView, TranscodeType> into(@NonNull ImageView view) {
   
   
    // 省略代码...

	// 主要看buildImageViewTarget
    return into(
        glideContext.buildImageViewTarget(view, transcodeClass),
        /*targetListener=*/ null,
        requestOptions,
        Executors.mainThreadExecutor());
  }

继续跟进:
buildImageViewTarget方法

  @NonNull
  public <X> ViewTarget<ImageView, X> buildImageViewTarget(
      @NonNull ImageView imageView, @NonNull Class<X> transcodeClass) {
   
   
    return imageViewTargetFactory.buildTarget(imageView, transcodeClass);
  }

跟进到buildTarget里面
ImageViewTargetFactory

  @NonNull
  @SuppressWarnings("unchecked")
  public <Z> ViewTarget<ImageView, Z> buildTarget(
      @NonNull ImageView view, @NonNull Class<Z> clazz) {
   
   
    if (Bitmap.class.equals(clazz)) {
   
   
      return (ViewTarget<ImageView, Z>) new BitmapImageViewTarget(view);
    } else if (Drawable.class.isAssignableFrom(clazz)) {
   
   
      return (ViewTarget<ImageView, Z>) new DrawableImageViewTarget(view);
    } else {
   
   
      throw new 
关于RecyclerView使用Glide加载图片导致错位问题总结 前言 使用recyclerView时遇到了图片错位的问题,这个问题网上已经讨论的很成熟,谨以此文章做个总结。 问题产生原因 根本原因: 因为有ViewHolder的重用机制,每一个item在移出屏幕后都会被重新使用以节省资源,避免滑动卡顿。 场景A: 1.第一次进入页面,RecyclerView载入,不做任何触摸操作 2.Adapter经过onCreateViewHolder()创建当前显示给用户... 阅读详情

相关推荐

Glide原理解析(一):加载流程分析

Glide 是目前非常流行的图片加载第三方开源库,而且功能极其强大,内部代码复杂程度也极其大。经过一番心理斗争决定还是要好好学习Glide的部分源码设计。

三木仔 1899

Android RecyclerView 使用Glide 加载图片刷新数据图片闪烁

Android RecyclerView 使用Glide 加载图片刷新数据图片闪烁 使用recyclerView.adapter.notifyDataSetChanged() 方法刷新已有数据导致图片闪烁Glide 加载代码 val requestOptions = RequestOptions().centerCrop() .format(DecodeFormat.PREFER_RGB_565) .priority(Priority.

nc_kai的博客 3221

AndroidGlide结合Recyclerview(也适用于Listview)实现列表滑动的时候图片加载,滑动停止的时候加载(已修正Listview部分以及排版)

很多人会问为什么要用 glide,其它的库可以么?其实只要图片库带有对应的方法都是可以的,只不过真心觉得这个库不错,就算是推荐吧。 然后着重讲 Recyclerview 是因为 Recyclerview 在 adapter 的 onBindViewHolder 中对item的操作比较严格,如果处理操作比较多,耗时长(比如单个item的图片比较多)就会造成Recyclerview卡的现象(Li

连大白的博客 1万+

Glide源码阅读之模板模式1

Glide源码阅读,必读的设计模式篇章

产品:SmartApi;服务:大前端++;其他技术分享 1286

Android卡片列表实战RecyclerView+CardView性能优化与兼容性指南

RecyclerViewAndroid中实现高效列表展示的核心组件,其核心价值在于视图复用机制与解耦的布局管理能力;CardView则并非简单美化控件,而是Material Design物理分层理念的可编程实现,通过cardElevation和cardCornerRadius模拟纸张Z轴高度与边缘弯曲。二者协同的关键技术价值在于兼顾UI一致性与运行时性能,尤其在中低端设备上需规避阴影渲染、动态文本高度、ViewHolder状态残留等典型陷阱。典型应用场景包括电商商品列表、新闻信息流、设置项面板等纯展示型界

weixin_30897233的博客 414

Android】画面卡顿优化列表流畅度三之RecyclerView刷新机制notifyItemRangeInserted

/ 在RecyclerView的适配器中,使用notifyItemRangeInserted通知数据插入// positionStart为插入操作的起始位置// itemCount为插入的数据项数量// ... 其他代码// 在适配器中定义数据集合// ... 其他代码// 在适配器中定义方法用于插入新的数据项// 在指定位置插入新数据// 通知适配器数据插入// ... 其他代码。

产品:SmartApi;服务:大前端++;其他技术分享 1530

RecyclerView 与 DataBinding 结合的 Android 列表开发最佳实践

RecyclerViewAndroid 官方推荐的列表容器,其核心价值在于可扩展的 LayoutManager 和生命周期友好的架构设计;DataBinding 则通过声明式语法实现 UI 与数据的自动同步,避免 findViewById 和手动刷新等易错操作。二者结合构成现代 Android 列表开发的底层基建,显著提升代码可维护性、UI 响应一致性与团队协作效率。该方案天然支持 ViewModel 生命周期感知、DiffUtil 智能刷新及 BindingAdapter 自定义逻辑扩展,广泛应用于

weixin_33755649的博客 395

Android】画面卡顿优化列表流畅度六(终篇)

历时一年半多开发终于smartApi-v1.0.0版本在2023-09-15晚十点正式上线api参数填写api请求响应数据展示PDF形式的分享文档Mock本地化解决方案api列表数据本地化处理再加上UI方面的打磨。

产品:SmartApi;服务:大前端++;其他技术分享 981

RecyclerView实战避坑指南:CardView圆角、图片闪烁、点击识别与性能优化

RecyclerViewAndroid 列表开发的核心组件,其本质是基于 ViewHolder 模式与 LayoutManager 协同实现的高效视图复用机制。理解其测量、布局、绑定与回收的生命周期原理,是解决白屏、闪烁、点击失效和卡顿等高频问题的技术基础。关键价值在于通过 DiffUtil 实现精准局部刷新、利用 ViewBinding 提升类型安全与可测性、结合 Glide加载与 Target 复用抑制 ImageView 闪烁,并借助坐标映射实现 CardView 内多区域精准点击识别。典型

weixin_33997389的博客 437

Android开发:RecyclerView与CardView实战指南

RecyclerView作为Android开发中替代ListView的现代化列表组件,通过ViewHolder模式和回收机制显著提升了列表性能与灵活性。其核心原理在于视图复用和数据绑定分离,配合LayoutManager可实现线性列表、网格布局等多种展示形式。CardView则是实现Material Design卡片式UI的关键控件,通过阴影和圆角属性创建具有视觉层次的界面元素。在移动应用开发中,这两种组件的组合使用能够高效构建符合现代设计规范的用户界面,特别适合新闻阅读、电商商品展示等需要复杂列表交互的场

weixin_33991418的博客 382

Android RecyclerView加载更多实战:从卡顿、重复请求到Paging3优化

RecyclerView 加载更多是 Android 列表分页的核心能力,其本质是滚动行为与数据状态的协同控制。原理上需精准识别滑动临界点、管理 Footer 占位、隔离网络生命周期,并避免 notifyDataSetChange 引发的 UI 卡顿。技术价值在于实现丝滑、稳定、可恢复的无限滚动体验,支撑信息流、电商列表、评论区等高频场景。本文聚焦真实开发痛点——快速滑动触发重复请求、横竖屏重建导致状态丢失、GridLayoutManager 下阈值计算错误,结合 BaseLoadMoreAdapter 封

weixin_30666401的博客 353

踩坑实录:Glide加载图片闪烁问题的真实排查记录

记录Glide列表闪烁排查与CustomTarget等官方方案避坑,强调内存泄漏风险。

2301_80221841的博客 1100

RecyclerView Multiple ViewTypes 实战:数据驱动的列表架构设计

RecyclerView 的 Multiple ViewTypes 是 Android 列表开发中处理异构内容的基础机制,其核心在于将不同结构的数据与对应 ViewHolder 建立静态契约,而非依赖 position 动态判断。该机制通过数据类型决定视图形态,保障复用安全、避免 ViewHolder 错位与点击事件错绑,显著提升复杂首页(如电商、新闻、社交类 App)的稳定性与可维护性。在真实业务中,它支撑横幅轮播、商品卡片、评论流、加载态等多类型混合展示,并为 DiffUtil 精准更新、状态管理(空/

weixin_30619101的博客 379

安卓期末项目实战:从零构建一个MVVM架构的社区应用

在移动应用开发领域,客户端架构设计与性能优化是构建高质量应用的核心基础。MVVM(Model-View-ViewModel)作为一种主流架构模式,通过数据绑定实现了视图与业务逻辑的清晰分离,有效提升了代码的可维护性和可测试性。其技术价值在于能够优雅地管理界面状态,并响应数据变化。在实际工程实践中,结合Jetpack组件库,开发者可以高效处理网络通信、数据持久化等常见场景。例如,在开发一个包含用户交互与内容展示的社区类应用时,合理运用RecyclerView进行列表渲染与分页加载,并借助Glide等库优化图片

weixin_30482181的博客 912

安卓开发入门实战:从环境搭建到首个完整应用开发指南

移动应用开发是现代软件开发的核心领域之一,其核心在于构建能在移动设备上运行的用户界面与业务逻辑。其原理涉及操作系统交互、UI渲染、数据持久化与网络通信等多个层面。掌握移动开发技术对于构建触达亿万用户的应用程序具有重要价值,广泛应用于社交、电商、工具及企业服务等场景。在安卓生态中,Kotlin凭借其空安全特性和简洁语法,已成为官方推荐的首选开发语言,能有效提升开发效率并减少运行时崩溃。同时,Gradle作为项目构建工具,负责管理依赖、编译打包,是项目配置的核心。本文将以一个待办清单应用为例,系统讲解从环境搭建

weixin_30299709的博客 351

Android RecyclerView Multiple ViewTypes 工程化实践指南

RecyclerView Multiple ViewTypes 是 Android 动态列表渲染的核心能力,其本质是解决异构 UI 组件在同一个列表中的混合复用问题。原理上依赖 getItemViewType 与 ViewHolder 生命周期协同,但真实挑战在于数据建模一致性、DiffUtil 精准比对、跨类型状态隔离及资源释放控制。技术价值体现在提升复杂 Feed 流、消息中心、商品详情页等场景的可维护性、滑动性能与内存稳定性。典型应用场景包括新闻混排(Banner/图文/视频)、电商详情页(推荐模块多

weixin_34248023的博客 454

Android RecyclerView开发实战:BaseRecyclerViewAdapterHelper核心功能与性能优化指南

Android应用开发中,RecyclerView是构建高效列表界面的核心组件,其Adapter设计模式负责管理数据与视图的绑定。理解RecyclerView的视图复用机制与数据驱动原理,是优化列表性能、实现复杂交互的基础。通过封装通用Adapter逻辑,开发者能显著提升开发效率,减少样板代码,并确保UI的流畅性。BaseRecyclerViewAdapterHelper(BRVAH)作为一款流行的第三方库,正是基于这些**工程实践**需求,提供了**多类型Item**支持、上拉加载更多、拖拽排序等开箱即

weixin_34372728的博客 362

RecyclerView与CardView底层原理及生产级优化指南

RecyclerViewAndroid UI渲染流水线的调度中心,其核心在于LayoutManager、Adapter、ItemDecoration和ItemAnimator四大解耦模块的协同工作;CardView则不仅是视觉容器,更是Material Design物理隐喻(elevation、shadow、outline)的实现载体。理解Recycler缓存池的四级复用机制与ViewHolder生命周期,可精准规避notifyDataSetChanged()滥用、点击空指针、滑动卡顿等高频问题。结合Pa

weixin_30588675的博客 278
上一篇: Kotlin协程学习之路(一):初识协程
下一篇: Kotlin协程学习之路(二):挂起函数
rockyou666
博客等级 码龄17年 70粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rockyou666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值