当前位置: 首页 > 知识库问答 >
问题:

Android使用gridlayoutmanager在recyclerview的最后一个元素下面添加间距

厉永宁
2023-03-14

我正在尝试使用GridLayoutManagerRecyclerView中的最后一个元素行下面添加间距。为此,我使用了自定义itemderection并在其最后一个元素时进行底部填充,如下所示:

public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
private int space;
private int bottomSpace = 0;

public SpaceItemDecoration(int space, int bottomSpace) {
    this.space = space;
    this.bottomSpace = bottomSpace;
}

public SpaceItemDecoration(int space) {
    this.space = space;
    this.bottomSpace = 0;
}

@Override
public void getItemOffsets(Rect outRect, View view,
                           RecyclerView parent, RecyclerView.State state) {

    int childCount = parent.getChildCount();
    final int itemPosition = parent.getChildAdapterPosition(view);
    final int itemCount = state.getItemCount();

    outRect.left = space;
    outRect.right = space;
    outRect.bottom = space;
    outRect.top = space;

    if (itemCount > 0 && itemPosition == itemCount - 1) {
        outRect.bottom = bottomSpace;
    }
}
}

这将对LinearLayoutManager正确工作。只是在GridLayoutManager的情况下,它是有问题的。

如果底部有fab并且需要最后一行中的项目滚动到fab上方,以便它们可见,那么它非常有用。

共有1个答案

江文斌
2023-03-14

这个问题的解决方案在于覆盖GridLayoutManager的SpanSizeLookup。

您必须对活动或片段中的GridlayoutManager进行更改,在这些活动或片段中您正在膨胀RecyLerView。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //your code 
    recyclerView.addItemDecoration(new PhotoGridMarginDecoration(context));

    // SPAN_COUNT is the number of columns in the Grid View
    GridLayoutManager gridLayoutManager = new GridLayoutManager(context, SPAN_COUNT);

    // With the help of this method you can set span for every type of view
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            if (list.get(position).getType() == TYPE_HEADER) {
                // Will consume the whole width
                return gridLayoutManager.getSpanCount();
            } else if (list.get(position).getType() == TYPE_CONTENT) {
                // will consume only one part of the SPAN_COUNT
                return 1;
            } else if(list.get(position).getType() == TYPE_FOOTER) {
                // Will consume the whole width
                // Will take care of spaces to be left,
                // if the number of views in a row is not equal to 4
                return gridLayoutManager.getSpanCount();
            }
            return gridLayoutManager.getSpanCount();
        }
    });
    recyclerView.setLayoutManager(gridLayoutManager);
}
 类似资料:
  • 我需要添加具有复杂项目背景的ListView:顶部和底部的偶数/奇数和圆角不同。它看起来像这样: 我已经通过level-list实现了所有这些东西,但是还有一件事我想做。现在底部项目靠近屏幕底部。最好添加一些空间。 我不想向 ListView 添加下边距,我只需要最后一项的边距。 我认为这样做的方法是: 一种黑客行为——在ListView中添加带有空文本视图的页脚。但是页脚是相当不稳定的东西,它们

  • 问题内容: 下面有一个for循环代码。我通过调用一个自定义显示函数发现aBook arrayList对象仅添加了最后一个类对象三次。为什么会这样呢? 这是我的LiFiAddressBook类 } 问题答案: 由于使用static关键字,每次 调用构造函数时,旧值都会被新值覆盖,并且在打印列表中的元素时,LiFiAddressBook类的对象变量将指向相同的对象。因此打印相似的对象。 需要明确的是,

  • 我成功地做到了这一点,但是以一种非常规的方式。在我的recyclerView适配器中,我对第一个元素使用了一个不同的viewHolder,一个更大的元素。这将是一个很好的解决方案,但第二个元素将低于第一个元素。所以我做了一个技巧,给recyclerView一个与第一个元素相同的固定高度,这样第一个元素和第二个元素就会重叠,我只需要让第二个元素的可见性消失。 但我并不特别喜欢这种方法。有人有更好的主

  • 问题内容: 我打算开发一个可在内显示一些动态数据的应用程序。所以我决定 在main中添加一个 。这是我的应用程序代码: 我的主要活动: 它是布局文件: 在这个rec​​yclerView内部还有另一个: 他们的适配器Main(RAdapter): 和第二个适配器: 我的问题是:正如您在CAdapter中看到的那样,仅显示构造函数的Log消息。 更新:如果有另一种方法可以在另一张动态卡中显示某些动态

  • 有人能帮忙吗?我正在尝试获取代表动态生成的智能卡(例如633597015500042010)的按钮的最后一个xpath元素,然后单击它。我尝试了以下方法,但仍然找不到解决方法。我打算捕获的按钮的名称是“Select”。 driver.findElement(by.xpath(“//div[@class='select-item']/div)[last()]”).click();

  • 额外的问题:我如何得到插值的结果,其中确切的时间戳的值是线性插值之间的两个周围的值?