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();
}
继续阅读与本文标签相同的文章
-
“公务车辆管理系统”哪家强?
2026-05-18栏目: 教程
-
区块链服务网络正式发布
2026-05-18栏目: 教程
-
团体标准《青少年编程能力等级》第1、2部分正式发布
2026-05-18栏目: 教程
-
【MySQL】逻辑架构
2026-05-18栏目: 教程
-
微软突然正式宣布,上亿用户措手不及!网友:又要多花钱了!
2026-05-18栏目: 教程
