3

背景

我需要以列表方式创建详细信息屏幕的 UI,其中包括各种字段。这就是我选择使用 RecyclerView 的原因,因为可能有很多字段,我不希望所有视图从一开始就被夸大。

问题

在其中一行中,我实际上必须放置标签。该行与大多数其他行一样有一个标题,并且可能像大多数其他行一样在右侧有一个图标,但真正的内容是标签本身。如果没有更多空间,它们会包装。

像这样的东西:

在此处输入图像描述

您看到的是一行,其中包含标题、侧面的图标和标签。标签集合在两侧有边距,在需要时换行到下一行,并占用图标下方的空间。

我发现了什么

谷歌有一个很好的库,叫做“flexbox-layout”(类似于各种流布局库),它允许在没有更多空间的情况下进行视图换行。它还允许使用FlexboxLayoutManagerfor RecyclerView,以便在可能的情况下回收视图。它可以很容易地初始化。例子:

val layoutManager = FlexboxLayoutManager(activity)
layoutManager.flexDirection = FlexDirection.ROW
layoutManager.flexWrap = FlexWrap.WRAP
layoutManager.justifyContent = JustifyContent.FLEX_START
layoutManager.alignItems = AlignItems.FLEX_START 
recyclerView.layoutManager=layoutManager

这将让视图一个接一个地水平移动,并在需要时换行到下一行。

现在有两种方法我认为我可以使用它,但都有问题:

  1. 让整个 RecyclerView 使用单个FlexboxLayoutManager,其中所有行占据整个宽度 ( match_parent),除了这部分,标签占据wrap_content. 这行得通,但后来我找不到如何单独为两侧的标签设置边距(右侧和左侧的,但不是中间的)。

  2. 有一个嵌套的 RecyclerView 将单独包含标签。内部 RecyclerView 将排成一行,布局的右侧有图标,两侧有边距。边距有效,因为它在自己的行内并带有布局。但是,由于它是嵌套的 RecyclerView,所有视图会同时膨胀,不会被回收。这意味着如果我有 100 个标签,当我到达这一行时,他们的所有视图都会被夸大。这对性能不利。如果它是一个带有 LinearLayoutManager 的水平 RecyclerView,这不会是一个问题(它在那里工作正常),但它不是。

对于这两种方法,还有侧面图标的问题,因为它应该只占用那里的空间,而在它的下方可能有更多的标签。

问题

  1. 是否可以有特殊限制,例如在右侧有一个图标,而所有其余的视图都相应地包装?

  2. 是否可以只有侧标签(每行的第一和最后一个)视图有边距,而其他的没有?

  3. 是否可以在不丢失其回收机制的情况下拥有嵌套的 RecyclerView?

4

0 回答 0