content: package com.quizapp.tollywood.widgets;
  import android.content.Context;
  import android.util.AttributeSet;
  import android.view.View;
  import android.view.ViewGroup;
   
  /**
   *
   * @author RAW
   */
  public class FlowLayout  extends ViewGroup {
  
      private int line_height;
  
      public FlowLayout(Context context) {
          super(context);
      }
  
      public FlowLayout(Context context, AttributeSet attrs){
          super(context, attrs);
      }
  
      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          assert(MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED);
  
          final int width = MeasureSpec.getSize(widthMeasureSpec);
  
          // The next line is WRONG!!! Doesn't take into account requested MeasureSpec mode!
          int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
          final int count = getChildCount();
          int line_height = 0;
  
          int xpos = getPaddingLeft();
          int ypos = getPaddingTop();
  
          for (int i = 0; i < count; i++) {
              final View child = getChildAt(i);
              if (child.getVisibility() != GONE) {
                  final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                  child.measure(
                          MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
                          MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED));
  
                  final int childw = child.getMeasuredWidth();
                  line_height = Math.max(line_height, child.getMeasuredHeight() + lp.height);
  
                  if (xpos + childw > width) {
                      xpos = getPaddingLeft();
                      ypos += line_height;
                  }
  
                  xpos += childw + lp.width;
              }
          }
          this.line_height = line_height;
  
          if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED){
              height = ypos + line_height;
  
          } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST){
              if (ypos + line_height < height){
                  height = ypos + line_height;
              }
          }
          setMeasuredDimension(width, height);
      }
  
      @Override
      protected LayoutParams generateDefaultLayoutParams() {
          return new LayoutParams(1, 1); // default of 1px spacing
      }
  
      @Override
      protected boolean checkLayoutParams(LayoutParams p) {
          return (p instanceof LayoutParams);
      }
  
      @Override
      protected void onLayout(boolean changed, int l, int t, int r, int b) {
          final int count = getChildCount();
          final int width = r - l;
          int xpos = getPaddingLeft();
          int ypos = getPaddingTop();
  
          for (int i = 0; i < count; i++) {
              final View child = getChildAt(i);
              if (child.getVisibility() != GONE) {
                  final int childw = child.getMeasuredWidth();
                  final int childh = child.getMeasuredHeight();
                  final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                  if (xpos + childw > width) {
                      xpos = getPaddingLeft();
                      ypos += line_height;
                  }
                  child.layout(xpos, ypos, xpos + childw, ypos + childh);
                  xpos += childw + lp.width;
              }
          }
      }
  }