RecyclerView自适应布局管理器

13

我正在使用 RecyclerViewStaggeredGridLayoutManager

我希望这个 StaggeredGridLayoutManager 或其他的 LayoutManager 能够占用空白区域(如果有的话)。例如,如果我设置 spanCount=3,即使只有2个或1个项目,它也必须占用整个屏幕宽度。在 StaggeredGridLayoutManager 中,我可以通过 setFullSpan(true); 来让单行充满整个屏幕,但无法将两个项目跨越一行。

我的 RecyclerView 代码:

StaggeredGridLayoutManager sglm= new StaggeredGridLayoutManager(spanCount,StaggeredGridLayoutManager.VERTICAL);
sglm.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);

我试过 AsymmetricGridViewtwoway-view 但总会有一片空白区域。

我收集了 Facebook App 的一些截图:

enter image description here

在这里,你可以看到 Google Keep App 中每行的高度固定,但每个项目的宽度是灵活的,而我从未在 Google Keep 上见过任何空白区域:

enter image description here

但当我使用 RecyclerView 时,总是有一片空白区域,如你可以看到图片的黑色部分是空白的。我希望 RecyclerView 可以通过扩展我的行来占据那个区域,就像 Google Keep 应用程序中所做的那样:

enter image description here

我访问了这个页面:android-how-to-create-a-facebook-like-images-gallery-grid,但没有帮助我。

这里是我访问的另一个页面:grid-of-images-like-facebook-for-android

是否有人使用 RecyclerView 或类似的 View? 有人能给我建议或想法,或指导我从哪里开始吗?


如果黑色部分是图像的一部分,我认为它无法解决。然而,管理屏幕宽度并且不留下额外空间是可以解决的。 - Developine
@HammadTariq 如果你看一下Google Keep,它的每一行高度都是固定的,而图片是灵活的。因此,你永远不会看到黑色部分。我可以修复宽度,但我总是在RecyclerView底部看到额外的空间。那么有没有什么方法或途径可以防止底部出现空白? - Yasin Kaçmaz
你想让所有行的高度相等吗?还是每一行的项目都应该有相等的高度?如果你希望所有行及其项目的高度相等,那么这是可能的。 - Developine
如果您查看Google Keep,第二行的行高是稳定的。所有项目具有相同的高度,对于第三行也是如此。而且,即使我的跨度计数为3,如果我每行有2个项目,这两个项目也必须占用整个屏幕宽度。此外,项目的宽度是灵活的,而不是固定的。 - Yasin Kaçmaz
3个回答

3

在Git上查看:

BitFrames

它可以帮助您按照您的意愿设置图像。

在Play Store上查看:

PlayStore应用


我会尝试这个项目并告诉您结果。谢谢。 - Yasin Kaçmaz
你正在使用这个项目吗? - Yasin Kaçmaz
这是我的老同事的项目。他很聪明。已经在一个项目中实现了。非常棒。 - SANAT
我尝试了您的方法,首先它并没有占用整个屏幕宽度,即使我设置了 android:layout_width="match_parent",同时它还限制了显示图像数量为4。这是截图:http://prntscr.com/cr62gn 。我想要列出无限数量的图像,并且它必须占用整个屏幕宽度。但是相比其他库来说,这个库还不错。 - Yasin Kaçmaz
你可以在那里(Git)留言,他会回复你的。 - SANAT

3
/**
 * A LayoutManager that lays out children in a staggered grid formation.
 * It supports horizontal & vertical layout as well as an ability to layout children in reverse.
 * <p>
 * Staggered grids are likely to have gaps at the edges of the layout. To avoid these gaps,
 * StaggeredGridLayoutManager can offset spans independently or move items between spans. You can
 * control this behavior via {@link #setGapStrategy(int)}.
 */


/**
 * Sets the gap handling strategy for StaggeredGridLayoutManager. If the gapStrategy parameter
 * is different than the current strategy, calling this method will trigger a layout request.
 *
 * @param gapStrategy The new gap handling strategy. Should be
 *                    {@link #GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS} or {@link
 *                    #GAP_HANDLING_NONE}.
 * @see #getGapStrategy()
 */
public void setGapStrategy(int gapStrategy) {
    assertNotInLayoutOrScroll(null);
    if (gapStrategy == mGapStrategy) {
        return;
    }
    if (gapStrategy != GAP_HANDLING_NONE &&
            gapStrategy != GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS) {
        throw new IllegalArgumentException("invalid gap strategy. Must be GAP_HANDLING_NONE "
                + "or GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS");
    }
    mGapStrategy = gapStrategy;
    setAutoMeasureEnabled(mGapStrategy != GAP_HANDLING_NONE);
    requestLayout();
}

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接