仿唯品会/京东/淘宝搜索流式布局的隐藏与展示

1. 项目需求:

如下,如果没有向下箭头(显示/隐藏剩余搜索词条)的话,采用flexbox-layout+Recycleview+FlexboxLayoutManager 可以实现流式布局。

加了这个箭头,做起来有点复杂,体现在:
1 怎么知道搜索词条总的数量超过2行了?
2 箭头应该在哪个位置出现?
原有的FlexboxLayoutManager 并没有提供类似的方法或是监听告知。可能需要用到自定义view来做特殊处理

在这里插入图片描述

2. 代码实现:

方案:采用FlowLayout,这里借鉴了FlowLayout,
思路:判断当前词条是否已经超过了2行,如果超过了2行,就获取到第2行最后一个view的索引值,然后在词条库中将此索引值对应的词条更改为特殊标记。当flowlayout获取到这个特殊标记时候,做相应的处理。
FlowLayout修改如下:
关键是:

	//OnLayout中:
 		if(lineCount==1){
   //第二行数据,并且有超过限定行数的时候
                lastGoneView = child;
                lastGoneView.setTag(i);//将此view的索引值放入tag中
                Log.d("HXY","CountIndex="+i);
        }
1. FlowLayout
public class FlowLayout extends ViewGroup {
   
    private static final String TAG = "FlowLayout";
    private static final int LEFT = -1;
    private OnTagClickListener mOnTagClickListener;

    private int limitLineCount; //默认显示3行 断词条显示3行,长词条显示2行
    private boolean isLimit; //是否有行限制
    private boolean isOverFlow; //是否溢出2行

    private View lastGoneView;//被隐藏的最后一个view

    public View getLastGoneView() {
   
        return lastGoneView;
    }

    protected List<List<View>> mAllViews = new ArrayList<List<View>>();
    protected List<Integer> mLineHeight = new ArrayList<Integer>();
    protected List<Integer> mLineWidth = new ArrayList<Integer>();
    private List<View> lineViews = new ArrayList<>();


    public boolean isOverFlow() {
   
        return isOverFlow;
    }

    private void setOverFlow(boolean overFlow) {
   
        isOverFlow = overFlow;
    }

    public boolean isLimit() {
   
        return isLimit;
    }

    public void setLimit(boolean limit) {
   
        if (!limit) {
   
            setOverFlow(false);
        }
        isLimit = limit;
        requestLayout();
    }

    public FlowLayout(Context context, AttributeSet attrs, int defStyle) {
   
        super(context, attrs, defStyle);
        limitLineCount = 2;
        isLimit = true;
    }

    public FlowLayout(Context context, AttributeSet attrs) {
   
        this(context, attrs, 0);
    }

    public FlowLayout(Context context) {
   
        this(context, null);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
        int modeHeight = MeasureSpec.getMode(heightMeasureSpec);

        // wrap_content
        int width = 0;
        int height = 0;

        int lineWidth = 0;
        int lineHeight = 0;

        //在每一次换行之后记录,是否超过了行数
        int lineCount = 0;//记录当前的行数

        int cCount = getChildCount();

        for (int i = 0; i < cCount; i++) {
   
            View child = getChildAt(i);
            if (child.getVisibility() == View.GONE) {
   
                if (i == cCount - 1) {
   
                    if (isLimit) {
   
                        if (lineCount == limitLineCount) {
   
                            setOverFlow(true);
                            break;
                        } else {
   
                            setOverFlow(fa
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值