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

Dan*_*lio 28 android android-support-library staggeredgridlayout android-recyclerview

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

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

StaggeredGridLayoutManager没有像GridLayoutManager那样为我提供这个功能.

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

Gab*_*tti 80

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

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

像这样的东西:

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

    StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
    layoutParams.setFullSpan(true);
}
Run Code Online (Sandbox Code Playgroud)

请注意.
它支持跨越所有列的视图,但它应该足够您的情况.

  • 如果您希望特定项目恰好跨越2(3列)列,该怎么办?而不是跨越所有列. (7认同)
  • 优化,如果特定viewType(例如标题)的所有视图都是完整范围,则应在`onCreateViewHolder()`中设置.如果某个视图是完整跨度而某些视图不是你必须在onBind中完成 (6认同)
  • 我得到一个`java.lang.ClassCastException:android.widget.RelativeLayout $ LayoutParams无法使用此方法强制转换为android.support.v7.widget.StaggeredGridLayoutManager $ LayoutParams` (3认同)
  • 正是我在寻找什么.非常感谢Gabriele! (2认同)

Doi*_*nhe 5

对于任何使用 Kotlin 的人。

onBindViewHolder中使用isFullSpan 有效。

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