如何构建具有可变高度子项的RecyclerView?

时间:2018-05-16 13:58:52

标签: android android-recyclerview

我正在处理的应用包含很多列表视图。在一种情况下,我有一个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
  • 在经理构造函数中传递spanCount为2且方向为Vertical
  • Boom,关闭冲刺票并忘掉它

再次感谢Stack社区,干杯!

1 个答案:

答案 0 :(得分:2)

控制RecyclerView项目展示位置和尺寸的最佳方法是通过其LayoutManager

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

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

另一方面,如果您只需要几个不同项目的“组”,则可以根据某些条件对不同的ViewHolder进行膨胀。以下是两种视图的示例代码。

@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);

    }
}