FlexboxLayoutManager限制显示行数

3,252 阅读1分钟

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