使用RecyclerView跨越多个列

时间:2014-12-11 16:24:07

标签: android layout-manager android-recyclerview

所以我想要的是交错布局,但列表中的第一项需要跨越两列。前两行也是固定高度。除了第一个项目跨越两列,我的一切都在工作。

我正在使用带有StaggeredGridLayoutManager的RecyclerView.Adapter。看起来它不是开箱即用的功能。我假设我可以制作一个自定义布局管理器,我不知道从哪里开始。我尝试过搜索,但我找不到任何关于如何让项目跨越多列的信息。

下面的图片是我在列表中寻找的内容。

Staggered layout

3 个答案:

答案 0 :(得分:50)

目前,StaggeredGridLayoutManager仅支持跨越所有列的视图(对于垂直配置的布局),而不支持任意数量的列。

如果您仍希望在所有列中跨越它们,则应在适配器实现中执行此操作:

public final void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

    StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
    layoutParams.setFullSpan(true);
}

恕我直言,StaggeredGridLayoutManager仍处于重大发展阶段,谷歌希望我们将其用于反馈:(

答案 1 :(得分:9)

我为跨垂直配置的布局跨越所有列所做的是创建新的LayoutParams并在适配器实现中将完整范围设置为true:

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {

    StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    layoutParams.setFullSpan(true);
    viewHolder.itemView.setLayoutParams(layoutParams);
}

答案 2 :(得分:0)

ljmelgui提出的解决方案效果很好,但可以与mato答案混合使用,以进行较小的优化,方法是在存在的情况下尝试重用layoutParams:

public final void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

    StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
    if ( layoutParams == null ) {
          layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }
    layoutParams.setFullSpan(true);
    viewHolder.itemView.setLayoutParams(layoutParams);
}