我有一个有两列的交错网格。这很有效。我想要的是位置0,行跨越2列。我之前使用GridLayoutManger很容易做到这一点:
mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return position == 0 ? 2 : 1;
}
});
StaggeredGridLayoutManager没有像GridLayoutManager那样为我提供此功能。
有不同的方法吗?我已经搜索但没有找到任何有相同问题的人,这是令人惊讶的,因为我认为这个功能对于我的场景和无限滚动非常有用,当ProgressBar显示在RecyclerView的最后一行时。
答案 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