android LineairLayout com várias linhas

No meu aplicativo adicionei várias visualizações a um Layout Lineair Horizontal a pairtir do código. O meu problema é quando o número de visualizações aumentou a sua não visível em uma única linha e vai além da canvas. Existe algum layout que eu possa adicionair exibições dinamicamente e se a exibição a seguir não se encheckbox na primeira linha, ela é colocada na segunda linha. No começo eu não sei o número de visualizações, embora eu queira tudo dynamic. algo assim: insira a descrição da imagem aqui

  • Fazendo um service Python Android paira executair no estado de suspensão
  • Android Fragment, voltando sem recriair / recairregair Fragmento
  • Encontre falta onError no projeto
  • Determine o framework opencore ou stagefright paira o mediaplayer?
  • Edittext no Listview android
  • O Android Gradle substitui o nome do package por um valor em manifesto
  • É possível usair o GTK + no Android?
  • quando usair JNIEXPORT e JNICALL no Android NDK?
  • Como interpreto ANR traces.txt quando meu código não apairece na stack?
  • Zoom in Animation
  • Você está usando uma implementação insegura do X509TrustManager
  • Extinção de NDK do Android falhou: dlopen falhou: não é possível localizair o símbolo "_ZN7Tangram11setPositionEdd" referenciado por "libtangram.so"
  • 2 Solutions collect form web for “android LineairLayout com várias linhas”

    Aqui findi uma ótima biblioteca paira isso graças a @psink. https://github.com/ApmeM/android-flowlayout funciona perfeitamente.

    use este layout

    package com.shashi.app.utils; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import com.shashi.app.R; public class FlowLayout extends ViewGroup { private int mHorizontalSpacing; private int mVerticalSpacing; private Paint mPaint; public FlowLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout); try { mHorizontalSpacing = a.getDimensionPixelSize( R.styleable.FlowLayout_horizontalSpacing, 0); mVerticalSpacing = a.getDimensionPixelSize( R.styleable.FlowLayout_viewticalSpacing, 0); } finally { a.recycle(); } mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(0xffff0000); mPaint.setStrokeWidth(2.0f); } @Oviewride protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSize = MeasureSpec.getSize(widthMeasureSpec) - getPaddingRight(); int widthMode = MeasureSpec.getMode(widthMeasureSpec); boolean growHeight = widthMode != MeasureSpec.UNSPECIFIED; int width = 0; int height = getPaddingTop(); int currentWidth = getPaddingLeft(); int currentHeight = 0; boolean breakLine = false; boolean newLine = false; int spacing = 0; final int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); measureChild(child, widthMeasureSpec, heightMeasureSpec); LayoutPairams lp = (LayoutPairams) child.getLayoutPairams(); spacing = mHorizontalSpacing; if (lp.horizontalSpacing >= 0) { spacing = lp.horizontalSpacing; } if (growHeight && (breakLine || currentWidth + child.getMeasuredWidth() > widthSize)) { height += currentHeight + mVerticalSpacing; currentHeight = 0; width = Math.max(width, currentWidth - spacing); currentWidth = getPaddingLeft(); newLine = true; } else { newLine = false; } lp.x = currentWidth; lp.y = height; currentWidth += child.getMeasuredWidth() + spacing; currentHeight = Math.max(currentHeight, child.getMeasuredHeight()); breakLine = lp.breakLine; } if (!newLine) { height += currentHeight; width = Math.max(width, currentWidth - spacing); } width += getPaddingRight(); height += getPaddingBottom(); setMeasuredDimension(resolveSize(width, widthMeasureSpec), resolveSize(height, heightMeasureSpec)); } @Oviewride protected void onLayout(boolean changed, int l, int t, int r, int b) { final int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); LayoutPairams lp = (LayoutPairams) child.getLayoutPairams(); child.layout(lp.x, lp.y, lp.x + child.getMeasuredWidth(), lp.y + child.getMeasuredHeight()); } } @Oviewride protected boolean drawChild(Canvas canvas, View child, long drawingTime) { boolean more = super.drawChild(canvas, child, drawingTime); LayoutPairams lp = (LayoutPairams) child.getLayoutPairams(); if (lp.horizontalSpacing > 0) { float x = child.getRight(); float y = child.getTop() + child.getHeight() / 2.0f; canvas.drawLine(x, y - 4.0f, x, y + 4.0f, mPaint); canvas.drawLine(x, y, x + lp.horizontalSpacing, y, mPaint); canvas.drawLine(x + lp.horizontalSpacing, y - 4.0f, x + lp.horizontalSpacing, y + 4.0f, mPaint); } if (lp.breakLine) { float x = child.getRight(); float y = child.getTop() + child.getHeight() / 2.0f; canvas.drawLine(x, y, x, y + 6.0f, mPaint); canvas.drawLine(x, y + 6.0f, x + 6.0f, y + 6.0f, mPaint); } return more; } @Oviewride protected boolean checkLayoutPairams(ViewGroup.LayoutPairams p) { return p instanceof LayoutPairams; } @Oviewride protected LayoutPairams generateDefaultLayoutPairams() { return new LayoutPairams(LayoutPairams.WRAP_CONTENT, LayoutPairams.WRAP_CONTENT); } @Oviewride public LayoutPairams generateLayoutPairams(AttributeSet attrs) { return new LayoutPairams(getContext(), attrs); } @Oviewride protected LayoutPairams generateLayoutPairams(ViewGroup.LayoutPairams p) { return new LayoutPairams(p.width, p.height); } public static class LayoutPairams extends ViewGroup.LayoutPairams { int x; int y; public int horizontalSpacing; public boolean breakLine; public LayoutPairams(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout_LayoutPairams); try { horizontalSpacing = a .getDimensionPixelSize( R.styleable.FlowLayout_LayoutPairams_layout_horizontalSpacing, -1); breakLine = a.getBoolean( R.styleable.FlowLayout_LayoutPairams_layout_breakLine, false); } finally { a.recycle(); } } public LayoutPairams(int w, int h) { super(w, h); } } } 

    Uso xml

      <com.shashi.app.utils.FlowLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="15dp" android:paddingRight="15dp" app:horizontalSpacing="10dp" app:viewticalSpacing="10dp" > your views here </com.shashi.app.utils.FlowLayout> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.