直接上代码,
创建AutoLinefeedLayout.java
import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * 自动换行布局 * @author zhao_pc */ public class AutoLinefeedLayout extends ViewGroup { public AutoLinefeedLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public AutoLinefeedLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public AutoLinefeedLayout(Context context) { this(context, null); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { layoutHorizontal(); } private void layoutHorizontal() { final int count = getChildCount(); final int lineWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); int paddingTop = getPaddingTop(); int childTop = 0; int childLeft = getPaddingLeft(); int availableLineWidth = lineWidth; int maxLineHight = 0; for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child == null) { continue; } else if (child.getVisibility() != GONE) { final int childWidth = child.getMeasuredWidth(); final int childHeight = child.getMeasuredHeight(); if (availableLineWidth < childWidth) { availableLineWidth = lineWidth; paddingTop = paddingTop + maxLineHight; childLeft = getPaddingLeft(); maxLineHight = 0; } childTop = paddingTop; setChildFrame(child, childLeft, childTop, childWidth, childHeight); childLeft += childWidth; availableLineWidth = availableLineWidth - childWidth; maxLineHight = Math.max(maxLineHight, childHeight); } } } private void setChildFrame(View child, int left, int top, int width, int height) { child.layout(left, top, left + width, top + height); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int heightMode = MeasureSpec.getMode(heightMeasureSpec); int count = getChildCount(); for (int i = 0; i < count; i++) { measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec); } if (heightMode == MeasureSpec.AT_MOST||heightMode == MeasureSpec.UNSPECIFIED) { final int width = MeasureSpec.getSize(widthMeasureSpec); super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec( getDesiredHeight(width), MeasureSpec.EXACTLY)); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } private int getDesiredHeight(int width) { final int lineWidth = width - getPaddingLeft() - getPaddingRight(); int availableLineWidth = lineWidth; int totalHeight = getPaddingTop() + getPaddingBottom(); int lineHeight = 0; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); final int childWidth = child.getMeasuredWidth(); final int childHeight = child.getMeasuredHeight(); if (availableLineWidth < childWidth) { availableLineWidth = lineWidth; totalHeight = totalHeight + lineHeight; lineHeight = 0; } availableLineWidth = availableLineWidth - childWidth; lineHeight = Math.max(childHeight, lineHeight); } totalHeight = totalHeight + lineHeight; return totalHeight; } }
使用方法:
xml中使用
<com.xxxx.view.AutoLinefeedLayout android:id="@+id/linearlayout_post" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
java添加子布局
避免在listview中布局重复问题,addview之前需调用
autolinefeedlayout.removeAllViews();
LayoutInflater inflater = LayoutInflater.from(this); LinearLayout ll = (LinearLayout) inflater.inflate(R.layout.xxx, null);
autolinefeedlayout.addView(ll);
作者:
薄荷记账 优秀源码探索者 简洁 稳定 优雅 无限可能!