【问题标题】:How to Construct a RecyclerView with Children of Variable Height?如何构建具有可变高度子级的 RecyclerView?
【发布时间】:2018-05-16 13:58:52
【问题描述】:

我正在开发的应用程序包含大量列表视图。在一种情况下,我有一个 recyclerView,它利用 GridLayoutManager 创建一个两列视图。就适配器而言,我还没有使用过 recyclerViews,但这是我遇到的问题。尽管具有适当的 wrap_content 属性,但视图中的每个项目都被调整为相同的高度。我想我的问题是,在每个子元素具有不同高度的情况下,是否有一个技巧可以解决这个问题? recyclerView 是否在幕后发生了某些事情,导致所有子元素具有最高子元素的固定高度?这听起来像是视图持有者的回收器问题吗?

我的适配器逻辑如下

public ClubViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.onboard_club, parent, false);

    return new ClubViewHolder(itemView, mRecyclerClickListener);
}


public void onBindViewHolder(final ClubViewHolder holder, int position) {

    Item club = clubList.get(position);
    if (null != club) {
        holder.clubTitleText.setText(club.getName());
        holder.subtitleText.setText(context.getResources().getString(R.string.club_members,club.getNumberMembers()+""));
        // Do some imageView logic here

    }

}

我需要在这里以编程方式设置高度吗?

编辑:为了进一步澄清,我膨胀的布局是这里有问题的布局。它是一个包含一个 imageView 和两个文本视图的 Vertical LinearLayout。我需要 LinearLayout 来包装子 XML 属性,但它目前没有这样做,尽管 LL 的高度为 wrap_content 并且所有子高度也设置为 wrap_content

解决方案:解决方案由以下用户发布。我会将更新留在这里,以供将来苦苦挣扎的人使用。

  • 我需要的布局:两列的子级高度不同
  • 像往常一样用适配器将其连接起来。
  • 在 recyclerView 小部件上设置 StaggeredGridLayoutManager
  • 在管理器构造函数中传入 2 的 spanCount 和 Vertical 的方向
  • 轰,关闭冲刺票,忘记它

再次感谢 Stack 社区,干杯!

【问题讨论】:

  • 或者你可以通过int viewType用不同的子布局来膨胀不同的布局
  • @Warrocker 为什么我要膨胀不同的布局?它们的样式完全相同,只是其中一些具有换行到新行的文本行,该行将其下方的内容向下推,因此我只需要父容器(在本例中为 LinearLayout)来扩展。我将容器的高度设置为包装内容

标签: android android-recyclerview


【解决方案1】:

控制RecyclerView 的项目位置和大小的最佳方法是通过其LayoutManager。

如果您正在寻找 GridView 的元素可以根据内容调整大小,您可以使用 StaggeredGridLayoutManager

交错网格布局的好例子can be found here。

另一方面,如果您只需要几个不同项目的“组”,您可以根据某些标准膨胀不同的ViewHolders。这是两种视图的示例代码。

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if (viewType == FILE_FLAG) {
        ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.file_item, parent, false);
        return new FileViewH(view);

    } else if (viewType == DIR_FLAG) {
        ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.dir_item, parent, false);
        return new DirViewH(view);

    }
}

【讨论】:

  • 谢谢!像魅力一样工作。我使用了 StaggeredGridLayoutManager 而不仅仅是 GridLayoutManager。通过 2 的跨度和垂直方向。我会用解决方案更新我的帖子。
  • 不客气。如果您想扩展我的答案,那么在问答网站范式中更多的是用新答案来回答您的问题,而不是用答案更新问题本身......
猜你喜欢
  • 2018-03-29
  • 2018-04-29
  • 1970-01-01
  • 2012-11-24
  • 2019-09-10
  • 2017-05-25
  • 1970-01-01
  • 2011-05-13
  • 2017-03-11
相关资源
最近更新 更多