38

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

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

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

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

4

3 回答 3

99

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

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

像这样的东西:

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

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

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

于 2015-11-14T11:28:24.133 回答
3

对于任何使用 Kotlin 的人。

在onBindViewHolder中使用isFullSpan 有效。

override fun onBindViewHolder(holder: LoadStateViewHolder, loadState: LoadState) {
        holder.bind(loadState)
        val layoutParams = holder.itemView.layoutParams as StaggeredGridLayoutManager.LayoutParams
        layoutParams.isFullSpan = true
    }
于 2020-11-03T10:13:40.007 回答
-1

正如@Daniele Segato 所说,

由于 ViewHolder 不应该改变,我们必须保持 onBindViewHolder 的精益,最好在 onCreateViewHolder 方法中设置 isFullSpan 参数。这个 LayoutParamter 是供父 View 即 RecylcerView 决定如何布局子 View。

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)
}

最终结果:不要使用 gridLayoutManger 的 SpanCoutLookUp 方法

于 2020-03-07T09:54:22.677 回答