包装布局上的GridLayoutManager不会调整RecyclerView的大小以显示项目

时间:2015-12-09 06:43:16

标签: android android-recyclerview gridlayoutmanager

带有RecyclerViewwrap_content

GridLayoutManager不会显示这些项目。它没有扩大为物品腾出空间。

首先,我注意到there is an issue (74772) open for it,但截至2015年12月尚未解决,not until “early 2016”

有人似乎已经制作了此CustomGridLayoutManager,还有available on Github,但它仍然没有为所有项目留出足够的空间,使RecyclerView显示为裁剪(但可滚动)即使有足够的空间容纳其父母的RecyclerView

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

1 个答案:

答案 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),看看是否/如何受到预先布局条件等的影响。