所以我想要的是交错布局,但列表中的第一项需要跨越两列。前两行也是固定高度。除了第一个项目跨越两列,我的一切都在工作。
我正在使用带有StaggeredGridLayoutManager的RecyclerView.Adapter。看起来它不是开箱即用的功能。我假设我可以制作一个自定义布局管理器,我不知道从哪里开始。我尝试过搜索,但我找不到任何关于如何让项目跨越多列的信息。
下面的图片是我在列表中寻找的内容。
答案 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);
}