在更改数据时,计算粘合式标题位置不正确
你好,我正在使用 StickyHeaderLinearLayoutManager 来管理我的 EpoxyRecyclerView,并在控制器中重写了 isStickyHeader() 函数:
override fun isStickyHeader(position: Int): Boolean {
return adapter.getModelAtPosition(position) is MyItemHeader
}
我注意到,在切换到 2 个数据集(2 个不同的过滤器,但使用相同的数据)时,第二个粘性标题会偏移 1 个,而一个正常的列表项则被设置为粘性标题。
集合 1 中有 4 行,集合 2 中有 174 行(包括项行、标题行和第一行,该行显示列表中有多少项)。
集合 1:[TitleItem(id: t1, value:2), MyItemHeader(id: h1, value: h1), Item(id: i1, value: val1), Item(id: i3, value: val3)]
集合 2:[TitleItem(id: t1, value:170), MyItemHeader(id: h1, value: h1), Item(id: i1, value: val1), Item(id: i2, value: val2), Item(id: i3, value: val3), Item(id: i4, value: val4), MyItemHeader(id: h2, value: h2), Item(id: i5, value: val5), ...]
因此,从集合 1 转换到集合 2 时,id2 会在 id1 和 id3 之间添加,其他行则会添加到末尾。
在调试时,我看到在更改时 HeaderPositionsAdapterDataObserver.onItemRangeInserted() 被两次调用,参数如下:
positionStart: 4, itemCount: 169
positionStart: 3 , itemCount: 1
因此,在第一次调用后,位置 6 正确地被设置为标题(headerPositions.add(6)),但第二次调用将其移动了一位,因为该调用被解释为在位置 3 添加了 1 个项。
我认为问题在于,当调用 onItemRangeInserted() 时,adapter 中的数据已经根据新数据(在 AsyncEpoxyDiffer.readOnlyList 中)进行了更新(因为它包含 174 个项)。因此,在插入时,标题将被设置为处理过程的末尾的正确位置(不需要对此进行更改)。现在,对项 i2 的插入所引起的第二次 onItemRangeInserted() 调用导致了标题 id 的移位。它假定差异列表再次发生了更改,但实际上并没有,因此不应发生位置的移位。
内容来源: airbnb/epoxy