在测量时,该类似乎只考虑每行的第一个孩子和第一个孩子(分配的任何维度取决于方向)。看到这个(我的评论):
if (getOrientation() == HORIZONTAL) {
if (i % getSpanCount() == 0) { // only for first child of row.
width = width + mMeasuredDimension[0];
}
if (i == 0) { // only for first item.
height = mMeasuredDimension[1];
}
}
方向发生了相同的事情VERTICAL
(在else
下面的内容中捕获)。
为了满足我的需求,我测量了每个孩子,检查每行中最大的孩子,然后将最大约束应用于该行。当每行完成测量后,将行大小添加到所需的总大小中。
if (getOrientation() == VERTICAL) {
rowMeasure[1] = Math.max(rowMeasure[1], childMeasure[1]);
rowMeasure[0] += childMeasure[0];
} else {
rowMeasure[0] = Math.max(rowMeasure[0], childMeasure[0]);
rowMeasure[1] += childMeasure[1];
}
// When finishing the row (last item of row), adds the row dimensions to the view.
if (i % getSpanCount() == getSpanCount() - 1 || i == state.getItemCount() - 1) {
rowsSized[addIndex] += rowMeasure[addIndex];
rowsSized[maxIndex] = Math.max(rowsSized[maxIndex], rowMeasure[maxIndex]);
rowMeasure[addIndex] = 0;
rowMeasure[maxIndex] = 0;
}
完整课程可在此答案的末尾找到。以上仅显示逻辑。
我还没有完全测试这个解决方案,因为我本周遇到了这个问题,并在昨天(12 月 8 日)再次尝试解决它——至少满足我的需要。
你可以用我的here查看我是如何解决这个问题的。WrappedGridLayoutManager
如问题评论中所述,您必须注意RecyclerView
's State
,改用它getItemCount()
。我还建议看一下getViewForPosition(int)
这是否/如何受到预布局条件等的影响。