RecyclerView
和wrap_content
的 GridLayoutManager
不会显示这些项目。它没有扩大为物品腾出空间。
首先,我注意到there is an issue (74772) open for it,但截至2015年12月尚未解决,not until “early 2016”。
有人似乎已经制作了此CustomGridLayoutManager
,还有available on Github,但它仍然没有为所有项目留出足够的空间,使RecyclerView
显示为裁剪(但可滚动)即使有足够的空间容纳其父母的RecyclerView
。
有关如何使RecyclerView
正确调整项目大小并在不滚动的情况下显示项目的任何想法(如果可能的话)?
答案 0 :(得分:-1)
在测量时,该类似乎只考虑每一行的第一个子节点和第一个子节点(无论指定哪个维度取决于方向)。看到这个(我的评论):
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;
}
本答案末尾提供完整课程。以上只显示了逻辑。
我还没有完全测试这个解决方案,因为我本周碰到了这个问题,并试图再次解决它 - 至少是为了我的需求 - 昨天(08年12月)。
您可以使用我的WrappedGridLayoutManager
here检查我是如何处理此问题的。
正如问题评论中所述,您必须使用其RecyclerView
来关注State
getItemCount()
。我还建议您查看getViewForPosition(int)
,看看是否/如何受到预先布局条件等的影响。