そのクラスは、測定時に最初の子と各行の最初の子のみを考慮しているようです(どちらの次元が割り当てられても、方向によって異なります)。これを参照してください(私によるコメント):
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;
}
完全なクラスは、この回答の最後にあります。上記はロジックのみを示しています。
今週この問題に遭遇し、昨日 (2008 年 12 月) に少なくとも私のニーズのために解決しようとしたため、まだこのソリューションを完全にテストしていませんでした。
ここで、この問題にどのように取り組んだかを確認できます。WrappedGridLayoutManager
issue のコメントに記載されているように、代わりにits を使用してRecyclerView
'sに注意を払う必要があります。また、これがプレレイアウトの条件などの影響を受けるかどうか、またはどのように影響を受けるかを確認することをお勧めします。State
getItemCount()
getViewForPosition(int)