Google公布了一个 FlexboxLayoutManager 控件,与RecyclerView配合可以简单实现流式布局,配置比较灵活确实比较好用。
但是为了节省空间,经常有这样的需求:
- 流式布局展示,支持item自动换行
- 只展示一行,超出部分不显示
为了实现上述需求,简单来说需要支持流式布局列表限制显示的行数。下面我们通过自定义FlexboxLayoutManager来实现这个功能:
public class LinesFlexBoxLayoutManager extends FlexboxLayoutManager {
/**
* 最大行数
*
* 小于等于0时,不限制行数
*/
private int maxLines = 0;
/**
* 设置最大显示行数
* @param maxLines
*/
public void setMaxLines(int maxLines) {
this.maxLines = maxLines;
}
public LinesFlexBoxLayoutManager(Context context) {
super(context);
}
public LinesFlexBoxLayoutManager(Context context, int flexDirection) {
super(context, flexDirection);
}
public LinesFlexBoxLayoutManager(Context context, int flexDirection, int flexWrap) {
super(context, flexDirection, flexWrap);
}
/**
* 删掉多余的行数据
*/
@Override
public List<FlexLine> getFlexLinesInternal() {
List<FlexLine> flexLines = super.getFlexLinesInternal();
int size = flexLines.size();
if (maxLines > 0 && size > maxLines) {
flexLines.subList(maxLines, size).clear();
}
return flexLines;
}
}
调用:
LinesFlexBoxLayoutManager labelLayoutManager = new LinesFlexBoxLayoutManager(mContext);
labelLayoutManager.setFlexDirection(FlexDirection.ROW);
labelLayoutManager.setAlignItems(AlignItems.FLEX_START);
labelLayoutManager.setMaxLines(1);
mBinding.recyclerView.setLayoutManager(labelLayoutManager);