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

通过这个判断就能得出以下问题
- 错误的边界判断:if (position < mList.size()) 这个判断是错误的
- 当有头部时:getItemCount() 返回 mList.size() + 1,所以position的范围是 [0, mList.size()]
- 当position = mList.size()时:这个条件会进入else分支,调用super.getItemViewType(position)
- 父类可能返回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类型(错误)
修复方案:
- 区分有无头部的情况
- 有头部时:position=0返回HEAD,position>0时从mList.get(position-1)获取数据
- 无头部时:直接从mList.get(position)获取数据
这样修复后,头部布局只会在列表顶部显示一次,不会在底部重复出现。