如何在LinearLayoutManager - RecyclerView中重叠项目(如堆叠卡片)

26


RecyclerView中是否有可能重叠项目?
我正在使用LinearLayoutManager尝试。
我的要求与LinearLayoutManager相同,只需从上到下重叠项目(如堆叠卡片)。

我已经看到可以使用ListView的一些变体。因此,我认为在RecyclerView中也可能实现。但是,在探索了一段时间后,我觉得要实现自定义布局管理器需要花费相当长的时间,并且需要相当广泛的理解。(我查看了Dave关于构建自定义LayoutManager的文章)

所以,现在我想根据我的要求仅使用ListView变体,而不是处理这么多复杂的自定义布局管理器。

但是,我只需要使内部项目重叠。我觉得可能还有其他我尚未意识到的方向。如果除了上述ListView变体和自定义布局管理器之外还有其他方案,请告诉我。

我也会在下面发布我的发现。

也许你可以利用这个项目 https://github.com/Diolor/Swipecards ? - kphil
2个回答

39

我假设您正在寻找部分重叠(例如,扑克牌轻微地展开)。如果是这样,使用RecyclerView和自定义的ItemDecoration似乎非常简单。以下是一个将项在垂直方向上重叠90像素的简单示例:

public class OverlapDecoration extends RecyclerView.ItemDecoration {

  private final static int vertOverlap = -90;

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

    outRect.set(0, vertOverlap, 0, 0);

  }
}

这个示例硬编码了偏移量,但是如果您的列表项高度不同,则需要测量并添加逻辑。

在设置布局管理器之前,将此装饰添加到RV中。我已经尝试过StaggeredGrid,但它也适用于LinearLayout和Grid LM。


1
它有一个奇怪的行为,只显示可以完全绘制的项目。它不会显示最底部下面的下一个项目的顶部部分。 - shiami
2
我知道这个答案可能不适合每个人,但我不明白为什么会有负评。它确实有效,即使像shiami所指出的那样,它不会显示下面项的顶部。这仍然是任何人对这个9个月老问题提供的唯一答案,并且是唯一建议的方法,不需要自定义布局管理器。 - MojoTosh
1
对于那些想知道如何避免顶部项的人,可以尝试类似以下代码:final int itemPosition = parent.getChildAdapterPosition(view); if (itemPosition == RecyclerView.NO_POSITION) { return; } 来获取视图的位置。对于顶部项,跳过 outRect.set() 行即可。 - h_k
完美,正是我所寻找的。 - Khurram Shehzad
1
为了避免第一项重叠。 int itemPosition = parent.getChildAdapterPosition(view); if (itemPosition != 0) { outRect.set(yourOffset, 0, 0, 0); } - jignesh.world
嘿,你能帮我做一个类似于这个堆栈的东西吗? - Alex Newman

2
您可以使用RecyclerView的ItemDecoration来实现。 设置ItemDecoration:
var customAdapter = CustomListAdapter()
recyclerView.addItemDecoration(MyItemDecoration()) // here set decoration in recyclerview
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = customAdapter

创建 ItemDecoration 类:

class MyItemDecoration : RecyclerView.ItemDecoration() {

    private val overlapValue = -60

    override fun getItemOffsets(outRect : Rect, view : View, parent : RecyclerView, state : RecyclerView.State) {
        outRect.set(0, 0, 0, overlapValue)  // args is : left,top,right,bottom
    }
}

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