解决列表复用时 top布局会在底部再次出现

发布于 2025-08-04 12:01:06

在adapter中经常使用多布局来展示数据 下面就是出现问题的布局判断

通过这个判断就能得出以下问题

  1. 错误的边界判断:if (position < mList.size()) 这个判断是错误的
  2. 当有头部时:getItemCount() 返回 mList.size() + 1,所以position的范围是 [0, mList.size()]
  3. 当position = mList.size()时:这个条件会进入else分支,调用super.getItemViewType(position)
  4. 父类可能返回HEAD类型:如果父类的getItemViewType方法在某些情况下返回HEAD类型,就会导致在列表末尾出现头部布局

正常的判断逻辑应该是先区分是否有头部再进行布局的判断

总结一下问题出现的原因和解决方式

在getItemViewType方法中,当isHaveHead = true时,position的范围是[0, mList.size()],但原代码中的判断条件position < mList.size()会导致:

  • position = 0时:返回HEAD(正确)
  • position = 1到mList.size()-1时:返回对应的动态类型(正确)
  • position = mList.size()时:进入else分支,调用父类方法,可能返回HEAD类型(错误)

修复方案:

  1. 区分有无头部的情况
  2. 有头部时:position=0返回HEAD,position>0时从mList.get(position-1)获取数据
  3. 无头部时:直接从mList.get(position)获取数据

这样修复后,头部布局只会在列表顶部显示一次,不会在底部重复出现。

0 条评论

发布
问题