【问题标题】:How to Overlap items in LinearLayoutManager - RecyclerView (like stacking cards)如何在 LinearLayoutManager 中重叠项目 - RecyclerView(如堆叠卡片)
【发布时间】:2014-12-24 07:50:46
【问题描述】:


是否可以与 RecyclerView 中的项目重叠?
我正在尝试使用 LinearLayoutManager。
我的要求和 LinearLayoutManager 中的一样,我只需要从上到下重叠里面的项目。 (如堆叠卡片)

我通过使用 ListView 看到了some variant。所以,我认为它会 在 RecyclerView 中也可以。但是,经过几次探索, 我觉得它需要相当长的时间来实现一个自定义 布局管理器,对此有相当程度的理解。(我看了 进入 Dave 关于Building Custom LayoutManager 的帖子)

所以,现在我想我可能只需要根据自己的要求使用 ListView 变体,而不是处理如此复杂的自定义布局管理器。

但是,我只需要让里面的项目重叠。我觉得可能还有其他一些我还没有意识到的方向。请让我知道是否有任何除了上面的 ListView 变体自定义布局管理器。

我也会在这里发布我的发现。

【问题讨论】:

标签: android listview android-recyclerview


【解决方案1】:

我假设您正在寻找部分重叠(例如,一副稍微散开的纸牌)。如果是这样,使用 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。

【讨论】:

  • 它有一个奇怪的行为,只显示可以完全绘制的项目。它不会在最底部的下方显示下一项的顶部。
  • 我知道这个答案可能不适合每个人,但我不理解反对票。它确实有效,即使正如 shiami 所说,它没有显示下面项目的顶部。这仍然是任何人为这个 9 个月大的问题提供的唯一答案,也是唯一不需要自定义布局管理器的建议方法。
  • 对于那些想知道如何避开顶部项目的人,可以尝试类似:final int itemPosition = parent.getChildAdapterPosition(view); if (itemPosition == RecyclerView.NO_POSITION) { return; } 来获取视图的位置。跳过顶部项目的 outRect.set() 行。
  • 完美,正是我想要的
  • 不堆叠第一个项目。 int itemPosition = parent.getChildAdapterPosition(view); if (itemPosition != 0) { outRect.set(yourOffset, 0, 0, 0); }
【解决方案2】:

您可以使用ItemDecorationRecyclerView 实现

设置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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多