Android 流式布局(修改版) 当达到两行,隐藏多余的

public class SearchLayout extends LinearLayout {

    private final int mParentWidth;
    private float textSize;
    private boolean textColor;
    private boolean background;
    private boolean isHide = true;

    public void setHide(boolean hide) {
        isHide = hide;
    }

    public SearchLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        //获取屏幕的宽度
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        mParentWidth = metrics.widthPixels - dip2px(16f);
        //自定义属性
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SearchLayout);
        background = array.getBoolean(R.styleable.SearchLayout_Sear_background,false);
        textColor = array.getBoolean(R.styleable.SearchLayout_Sear_textColor, false);
        textSize = array.getDimension(R.styleable.SearchLayout_Sear_textSize, 0);
        //方向为纵向
        setOrientation(VERTICAL);
    }

    //移除子控件
    public void removeView() {
        removeAllViews();
    }

    //流式布局
    public void setData(List<String> data) {
        if (data.isEmpty()){
            return;
        }
        //获取一个子布局
        LinearLayout linearLayout = getLinearLayout();
        for (int i = 0; i < data.size(); i++) {
            //标题
            final String name = data.get(i);
            //已存在的宽度
            int numBar = 0;
            //子控件的个数
            int count = linearLayout.getChildCount();
            for (int j = 0; j < count; j++) {
                //一个一个获取
                ThemeTextView textView = (ThemeTextView) linearLayout.getChildAt(j);
                //获取左外边距
                LayoutParams params = (LayoutParams) textView.getLayoutParams();
                int leftWidth = params.leftMargin;
                int rightWidth = params.rightMargin;
                //获取宽高
                textView.measure(getMeasuredWidth(), getMeasuredHeight());
                //计算已存在的宽度
                numBar += textView.getMeasuredWidth()+leftWidth+rightWidth;
            }
            //获取一个子控件
            ThemeTextView text = getText();
            //给每一个控件设置点击事件
            text.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onItemTitleClickListener != null){
                        onItemTitleClickListener.onItemTitle(name);
                    }
                }
            });
            //赋值
            text.setText(name);
            //获取宽高
            text.measure(getMeasuredWidth(), getMeasuredHeight());
            //当前控件的宽度
            int textWidth = text.getMeasuredWidth() + text.getPaddingLeft() + text.getPaddingRight();
            //判断是否超过屏幕
            if (isHide && getChildCount() == 2){
                ImageView imageView = getMore(false);
                LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams();
                int leftM = layoutParams.leftMargin;
                int rightM = layoutParams.rightMargin;
                imageView.measure(getMeasuredWidth(), getMeasuredHeight());
                int width = imageView.getMeasuredWidth() + imageView.getPaddingLeft() + imageView.getPaddingRight();
                int imageWidth = leftM + rightM + width;
                if (numBar + textWidth + imageWidth >= mParentWidth){
                    if (numBar + textWidth + imageWidth > mParentWidth){
                        imageView.setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (onMoreClickListener != null){
                                    onMoreClickListener.onShowMore(isHide);
                                }
                            }
                        });
                        linearLayout.addView(imageView);
                        return;
                    } else {
                        imageView.setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (onMoreClickListener != null){
                                    onMoreClickListener.onShowMore(isHide);
                                }
                            }
                        });
                        linearLayout.addView(text);
                        linearLayout.addView(imageView);
                        return;
                    }
                }else {
                    if (i + 1 <= data.size()-1) {
                        String title = data.get(i + 1);
                        ThemeTextView themeTextView = getText();
                        themeTextView.setText(title);
                        themeTextView.measure(getMeasuredWidth(),getMeasuredHeight());
                        int themeTextViewWidth = themeTextView.getMeasuredWidth() + themeTextView.getPaddingLeft() + themeTextView.getPaddingRight();
                        if (mParentWidth >= numBar + textWidth + imageWidth + themeTextViewWidth ){
                            linearLayout.addView(text);
                            continue;
                        }else {
                            imageView.setOnClickListener(new OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    if (onMoreClickListener != null){
                                        onMoreClickListener.onShowMore(isHide);
                                    }
                                }
                            });
                            linearLayout.addView(text);
                            linearLayout.addView(imageView);
                            return;
                        }
                    }
                }
            }


            if (i == data.size() - 1 && (getChildCount() >= 3 || (mParentWidth < numBar + textWidth) && getChildCount() == 2)){
                ImageView imageView = getMore(true);
                LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams();
                int leftM = layoutParams.leftMargin;
                int rightM = layoutParams.rightMargin;
                imageView.measure(getMeasuredWidth(), getMeasuredHeight());
                int width = imageView.getMeasuredWidth() + imageView.getPaddingLeft() + imageView.getPaddingRight();
                int imageWidth = leftM + rightM + width;
                imageView.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (onMoreClickListener != null){
                            onMoreClickListener.onShowMore(isHide);
                        }
                    }
                });
                if (mParentWidth >= numBar + textWidth + imageWidth){
                    linearLayout.addView(text);
                    linearLayout.addView(imageView);
                }else {
                    if (mParentWidth >= numBar + textWidth){
                        linearLayout.addView(text);
                        linearLayout = getLinearLayout();
                        linearLayout.addView(imageView);
                    }else {
                        linearLayout = getLinearLayout();
                        linearLayout.addView(text);
                        linearLayout.addView(imageView);
                    }
                }
                return;
            }

            if (mParentWidth >= numBar + textWidth) {
                //没有,继续添加
                linearLayout.addView(text);
            } else {
                //否者,重新获取一个子布局,再添加
                linearLayout = getLinearLayout();
                linearLayout.addView(text);
            }

        }
    }

    public LinearLayout getLinearLayout() {
        //创建LinearLayout布局
        LinearLayout linearLayout = new LinearLayout(getContext());
        //设置宽高
        LayoutParams params = new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        linearLayout.setLayoutParams(params);
        //添加到主布局中
        this.addView(linearLayout);
        return linearLayout;
    }

    public ThemeTextView getText() {
        //创建TextView控件
        //设置字体大小,颜色,内边距
        ThemeTextView themeTextView = new ThemeTextView(getContext());
        themeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX , textSize);
        themeTextView.setMaxEms(7);
        themeTextView.setLines(1);
        themeTextView.setEllipsize(TextUtils.TruncateAt.END);
        themeTextView.setPadding(dip2px(8), dip2px(4), dip2px(8), dip2px(4));
        if (textColor){//可以根据自己的需求修改判断
        	themeTextView.setTextColor(ContextCompat.getColor(getContext(),R.color.day_text_color_thirdly));
        }else {
            themeTextView.setTextColor(ContextCompat.getColor(getContext(),R.color.day_text_color_thirdly));
        }

        if (background){
              themeTextView.setBackgroundResource(R.drawable.border_search_background_day);
        }
        //设置宽高
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        //外边距
        params.setMargins(dip2px(8),dip2px(8),dip2px(8),dip2px(8));
        themeTextView.setLayoutParams(params);
        return themeTextView;
    }

    public ImageView getMore(boolean isHide){
        ImageView imageView = new ImageView(getContext());
        if (background){
           imageView.setBackgroundResource(R.drawable.border_search_background_day);
        }
        imageView.setImageResource(R.drawable.icon_more);

        if (isHide){
            imageView.setRotation(180f);
        }
	    imageView.setColorFilter(ContextCompat.getColor(getContext(),R.color.day_text_color_primary));
        imageView.setPadding(dip2px(6), dip2px(6), dip2px(7), dip2px(7));

        //设置宽高
        LayoutParams params = new LayoutParams(ConfigSingleton.dip2px(27), ConfigSingleton.dip2px(27));
        //外边距
        params.setMargins(dip2px(8),dip2px(8),dip2px(8),dip2px(8));
        imageView.setLayoutParams(params);
        return imageView;
    }

    public interface OnItemTitleClickListener{
        void onItemTitle(String title);
    }

    public interface OnMoreClickListener{
        void onShowMore(boolean ishide);
    }

    private OnItemTitleClickListener onItemTitleClickListener;
    private OnMoreClickListener onMoreClickListener;

    public void setOnItemTitleClickListener(OnItemTitleClickListener onItemTitleClickListener) {
        this.onItemTitleClickListener = onItemTitleClickListener;
    }

    public void setOnMoreClickListener(OnMoreClickListener onMoreClickListener) {
        this.onMoreClickListener = onMoreClickListener;
    }

	public int dip2px(float dipValue) {
			float scale = getContext().getResources().getDisplayMetrics().density;
			return (int) (dipValue * scale + 0.5f);
		}
}

attrs文件:

	<declare-styleable name="SearchLayout">
        <attr name="Sear_textSize" format="dimension"/>
        <attr name="Sear_textColor" format="boolean"/>
        <attr name="Sear_background" format="boolean"/>
    </declare-styleable>

你可能感兴趣的:(自定义View)