1获得屏幕宽度
  Context context;
    private  int pingmuwidth;

    public MyFlowLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context=context;
        //获得屏幕宽度
        pingmuwidth = context.getResources().getDisplayMetrics().widthPixels;
        //将最外层的LinearLayout(本类继承的这个)设置成竖向的
        setOrientation(VERTICAL);
    }

2.定义获得横向的LinearLayout的方法

 private LinearLayout getLin(){
        //自己定义的横向的linearLayout;
        LinearLayout linearLayout=new LinearLayout(context);
        LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
        linearLayout.setLayoutParams(params);
        //(this)代表本类继承的linearLayout(竖向)
        this.addView(linearLayout);//给竖向的linearLayout添加自已写的这个横向的linearLayout
        return linearLayout;
        }

3.定义获得横向的LinearLayout中要添加的TextView方法

private TextView getTextView(){
        //这些就不打注释了相信一看能理解
        TextView tv=new TextView(context);
        LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        tv.setPadding(10,3,10,3);
        tv.setTextSize(25);
        tv.setTextColor(Color.BLACK);
        params.leftMargin=10;
        tv.setLayoutParams(params);
        return tv;
    }

4.把集合传到此方法内就能显示了

public void setData(List<String> list){
        //获得个横向的linearLayout;
        LinearLayout linearLayout=getLin();
        //遍历传过来的集合
        for (int i = 0; i < list.size(); i++) {
            int numwidth=0;//定义已经显示的这一行的宽度
            //这一行有多少的子控件(TextView)
            int count=linearLayout.getChildCount();
            //遍历只这一行已经有的子控件(TextView)
            for (int j = 0; j < count; j++) {
                //获得这一行的子控件(TextView)
                TextView tv= (TextView) linearLayout.getChildAt(j);
                //获得此控件的参数
                LayoutParams tvParams= (LayoutParams) tv.getLayoutParams();
                //获得左外边距
                int tvleftMargin=tvParams.leftMargin;
                //测量此控间的宽高
                tv.measure(getMeasuredWidth(),getMeasuredHeight());
                //得到此控件的宽度(只要宽度就可以)
                int width=tv.getMeasuredWidth();
                //给这一行过的宽度赋值(下面判断有没有超过屏幕宽度用)
                numwidth+=tvleftMargin+tv.getPaddingLeft()+tv.getPaddingRight()+width;
            }
            //获得横向linearLayout即将要添加这个TextView
            TextView textView=getTextView();
            //给这个textView赋值(fori遍历的数据)
            textView.setText(list.get(i));
            //获得控件里面的参数
            LayoutParams textParams= (LayoutParams) getLayoutParams();
            //获得做外边距
            int textleftMargin=textParams.leftMargin;
            //测量此控件间
            textView.measure(getMeasuredWidth(),getMeasuredHeight());
            //获得此空间的宽度(测量的宽度+左外边距+左padding+右padding)
            int textWidth=textleftMargin+textView.getMeasuredWidth()+textView.getPaddingLeft()+textView.getPaddingRight();

            //numwidth是这一行已经显示的这些控件(也就是说没超过屏幕宽度这些控件的宽度)
            //textWidth是这一行即将要添加的控件的宽度(包括外边距和内边距)
            //然后判断已将显示的这些空间的宽度+即将要添加这个控件的宽度是否超过了屏幕宽度
            if(pingmuwidth>=numwidth+textWidth){
                //没有超过屏幕宽度就把要添加这的textview添加到已经显示的这一行
                linearLayout.addView(textView);
            }else{
                //超过了屏幕宽度通过getLin()另起一行(因为咱们最外层的linearLayout是竖向的,getLin()给最外层的LinearLayout添加了一个横向的了)
                //然后再把这个要添加的控件添加到新的这一行(横向的linearLayout)中
                linearLayout=getLin();//重新给上面的linearLayout赋值就是另一起一行
                //把这个要添加的控件添加到新的这一行(横向的linearLayout)中
                linearLayout.addView(textView);
            }
        }
    }

5.清除所有子控件的方法

 public void clearchildView(){
        removeAllViews();
    }
收藏 打印