【问题标题】:RecyclerView with unknown/variable row layouts具有未知/可变行布局的 RecyclerView
【发布时间】:2016-10-17 00:37:23
【问题描述】:

由于 RecyclerView 使用 ViewHolders,这意味着您必须为每一行预先定义布局。但是如果每一行都需要显示不同数量的视图呢?

例如,假设我正在创建一个即时消息应用程序,用户可以在其中将图片附加到消息中。他们可以附加从 0 到 x 张图片的任何位置。当您创建 RecyclerView 来显示这些图片(从服务器下载的)时,如何使行包含正确数量的 ImageView 以显示它们?

我有几种方法可以做到这一点,但似乎没有一个是好的选择。

  1. 在 onBindViewHolder 中创建 ImageView,将它们添加到 ViewHolder 中的布局中。 (这不是 ViewHolder 试图阻止的吗?这可能会很滞后,尤其是在有很多图片的情况下)
  2. 将用户可以附加到消息的图片数量限制为 x,然后将 x 个 ImageView 添加到设置为不可见/消失的布局中。在onBindViewHolder中,设置ImageViews显示图片,并设置这些ImageViews可见。 (如果我允许附加图片和视频怎么办?那么我还需要添加 x ImageViews 和 x VideoViews 吗?)
  3. 在每个 RecyclerView 项中放置一个 GridView 并填充 GridView 在 onBindViewHolder 里面。 (我认为这对 选项 #1,因为它几乎是一样的?)

这就是我能想到的。是否有任何其他选项专为我没有遇到过的这种情况而设计?或者解决这个问题的典型方法是什么?

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    您需要创建一个异构的RecyclerView,它将显示多个不同的ViewHolders。有几种方法可以做到这一点。

    基本方法是根据与RecyclerView.Adapter 中每个项目关联的照片/视频的数量,您将覆盖getItemViewType(int position)(这是RecyclerView.Adapter 类的一部分的方法)以返回不同的@987654328 @。这个int 是传递给createViewHolder(ViewGroup parent, int viewType)viewType 参数。然后,您将根据 viewType 参数使用正确的 ViewHolder/layout。

    请参阅here 以获得良好的教程。

    如果您不介意使用库作为替代方法,我推荐 AdapterDelegates

    【讨论】:

    • 我知道 RecyclerView 中的不同视图类型,但这与我的问题无关。视图类型用于对行应用不同的布局,但它仍然假定行具有静态布局。我需要一个解决方案,其中 RecyclerView 项目在布局中具有可变数量的视图。
    • 我明白了。然后,我将采用您提出的第二个想法,即使用一个查看器并根据行内容显示/隐藏,或者我仍然会像想法 2 中那样限制图像和视频的数量,但创建代表可能组合的单独查看器。跨度>
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2016-07-19
    相关资源
    最近更新 更多