在StaggeredGridLayoutManager中设置单行的跨度大小

时间:2015-11-13 15:24:27

标签: android android-recyclerview android-support-library staggeredgridlayout

我有一个有两列的交错网格。这很有效。我想要的是位置0,行跨越2列。我之前使用GridLayoutManger很容易做到这一点:

                mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                    @Override
                    public int getSpanSize(int position) {
                        return position == 0 ? 2 : 1;
                    }
                });

StaggeredGridLayoutManager没有像GridLayoutManager那样为我提供此功能。

有不同的方法吗?我已经搜索但没有找到任何有相同问题的人,这是令人惊讶的,因为我认为这个功能对于我的场景和无限滚动非常有用,当ProgressBar显示在RecyclerView的最后一行时。

3 个答案:

答案 0 :(得分:68)

您可以使用setFullSpan方法 通过这种方式,项目将使用所有跨度区域进行布局。

  

这意味着,如果方向是垂直的,视图将具有全宽;如果方向是水平的,则视图将具有全高。

这样的事情:

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

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

注意 它支持跨越所有列的视图,但对于您的情况应该足够了。

答案 1 :(得分:0)

适用于使用Kotlin的任何人。

onBindViewHolder 中使用 isFullSpan 即可。

override fun onBindViewHolder(holder: LoadStateViewHolder, loadState: LoadState) {
        holder.bind(loadState)
        val layoutParams = holder.itemView.layoutParams as StaggeredGridLayoutManager.LayoutParams
        layoutParams.isFullSpan = true
    }

答案 2 :(得分:-1)

如@Daniele Segato所说,

由于不应更改ViewHolder,而必须保持onBindViewHolder精益。因此,最好在onCreateViewHolder方法中设置isFullSpan参数。此LayoutParamter用于父视图(即RecylcerView),以决定如何布局子视图。

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StaggeredProductCardViewHolder {
    var isFullSpan = false
    var layoutId = R.layout.shr_staggered_product_card_first
    if (viewType == 1) {
        layoutId = R.layout.shr_staggered_product_card_second
    } else if (viewType == 2) {
        layoutId = R.layout.shr_staggered_product_card_third
        isFullSpan = true

    }

    val layoutView = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
    (layoutView.layoutParams as StaggeredGridLayoutManager.LayoutParams).isFullSpan= isFullSpan
    return StaggeredProductCardViewHolder(layoutView)
}

Final Result: Don't use gridLayoutManger's SpanCoutLookUp Method