项目场景:
RecyclerView使用GridLayoutManager时上拉加载更多遇到bug
例如:layoutManager = GridLayoutManager(context, 3),上拉加载更多调用adapter.loadMoreModule.loadMoreEnd()后,没有更多数据直接作为一个item显示在1/3的格子里。
ps:这里的adapter用的com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4
问题描述:
正常使用上拉加载更多时我们一般用LinearLayoutManager,上拉加载更多的状态栏都是显示在列表最底部。
但是当使用GridLayoutManager时,他显示在最后一个position+1(list.size+1)的位置而不是显示在列表最底部,这明显不符合我们的需求,我们得把他改成显示在列表的下方而不是显示在最后一个position+1
原因分析:
深入研究了一下上拉加载更多的原理,其实是以footView的形式内部封装的。
footView当然是显示在最后一个position+1的位置没毛病,只是我们通常用的LinearLayoutManager,这个没影响,只是用到了GridLayoutManager时问题就浮出水了。
解决方案:
原来的layoutManager 是这样设置的 binding.rvBookshelf.layoutManager = GridLayoutManager(requireContext(), 3)
把layoutManager 改成如下方式,判断当前的position是不是footview的position,如果是让他占满一行,如果不是该是跟原需求一样一行3列,就可以完美的解决问题了。
var manager = GridLayoutManager(context, 3)
manager.spanSizeLookup =
object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
if (list == null || list.size == 0)
return 3
return if (adapter.footerViewPosition == position) {
3
} else {
1
}
}
}
binding.rvBookshelf.layoutManager = manager