1

RecyclerViewwrap_contentGridLayoutManager不显示项目。它不会放大以便为物品腾出空间。

首先,我注意到有一个问题 (74772) 对其开放,但截至 2015 年 12 月尚未解决,直到“2016 年初”</a>。

似乎有人制作了这个CustomGridLayoutManager,也可以在 Github 上找到,但它似乎仍然没有为所有项目腾出足够的空间,RecyclerView即使RecyclerView在其父级中有足够的空间时,它也会使显示被裁剪(但可滚动)。

关于如何RecyclerView正确调整项目大小并在不滚动的情况下显示它的任何想法,如果可能的话?

4

1 回答 1

-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;
}

完整课程可在此答案的末尾找到。以上仅显示逻辑。

我还没有完全测试这个解决方案,因为我本周遇到了这个问题,并在昨天(12 月 8 日)再次尝试解决它——至少满足我的需要。

你可以用我的here查看我是如何解决这个问题的。WrappedGridLayoutManager

如问题评论中所述,您必须注意RecyclerView's State,改用它getItemCount()。我还建议看一下getViewForPosition(int)这是否/如何受到预布局条件等的影响。

于 2015-12-09T06:43:15.827 回答