Android RecyclerView 重叠项(卡片堆叠)

8
如何在RecyclerView中重叠项目?就像堆叠卡片一样。提前感谢。

你做了这个吗?我需要相同的视图。 - Denis Nek
@DenisNek:抱歉,不行。因为 LayoutManager 的方法不太容易,我仍然使用 ListView 来实现它。 - shiami
@denis Nak,你有解决这个问题吗?我也遇到了同样的问题。 - user9550968
https://github.com/amyu/StackCardLayoutManager - Reejesh PK
3个回答

17

为了重叠recyclerView行,您可以使用以下方法。

将此类添加到您的活动中。您可以自定义vertOverlap。

   public class OverlapDecoration extends RecyclerView.ItemDecoration {

    private final static int vertOverlap = -40;

    @Override
    public void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        final int itemPosition = parent.getChildAdapterPosition(view);
        if (itemPosition == 0) {
            return; }
        outRect.set(0, vertOverlap, 0, 0);


    }
} `

在设置RecyclerView的布局管理器之前,添加您的装饰,然后我们就完成了。

    mRecyclerView.addItemDecoration(new OverlapDecoration());
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

感谢 @MojoTosh https://dev59.com/X14c5IYBdhLWcg3wssFs#29067942


我已经回复了解决方案,但是出现了一个问题:它有一种奇怪的行为,只显示可以完全绘制的项目。它不会显示最底部下面的下一个项目的顶部部分。 - shiami
@shiami,您能详细解释一下吗?或者提供一下您当前问题的截图。在我的情况下,第一行保持不变,其他行都正确地重叠了。 - opsenes
为了重叠所有项目,您可以删除 if (itemPosition == 0,因为如果在recyclerview中有填充/边距,则它是无用的。 - Neuron

0
你必须编写自己的 LayoutManager 或继承 LinearLayoutManager。

谢谢您的回答。您能提供一些开始的想法吗? - shiami
1
你应该先阅读“LinearLayoutManager”的源代码,实际上你需要修改大部分代码。我相信你可以开始将整个源代码复制为你自己的“CardStackLayoutManager”,并尝试编辑“onLayoutChildren”。 - Derek Fung
谢谢。我会尝试的。 - shiami
我发现扩展或修改LinearLayoutManager很困难。寻找另一种更简单的方法。 - shiami
是的,制作LayoutManager并不容易。也许你可以尝试通过一些绘图来伪造它,例如让每个项目添加一个子项作为下面项目的顶部部分。 - Derek Fung

0

opsenes的答案非常好!但是我添加了一个百分比计算,而不是固定值,这样它就可以适用于多个设备和屏幕。

class ItemDecorator() : RecyclerView.ItemDecoration() {

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        val position = parent.getChildAdapterPosition(view)
        if (position != 0) {
            val widthOverlapPercentage = 0.25
            val previousView = parent[position - 1]
            val overlapWidth = previousView.width * widthOverlapPercentage
         outRect.left = overlapWidth.toInt() * -1
        }
    }
}

我的解决方案基于一个横向RecyclerView,所以如果你想要实现纵向,只需将previousView.widthpreviousView.height交换,并将outRect.leftoutRect.top交换。
您还可以设置重叠百分比,其中0表示没有重叠,1表示完全重叠。


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