How can I do something like a FlowLayout in Android?

后端 未结 9 1403
情歌与酒
情歌与酒 2020-11-22 08:11

How can I do something like a FlowLayout in Android?

9条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-22 08:30

    Here is the custom class where you can achive layout like following with adding dynamicaly view (Also called FlowLayout).

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewGroup;
    
    /*
    Created By Dhavalkumar Solanki
    * */
    public class FlowLayout extends ViewGroup {
    
        private int line_height_space;
    
        public static class LayoutParams extends ViewGroup.LayoutParams {
    
            public int horizontal_spacing;
            public int vertical_spacing;
    
            /**
             * @param horizontal_spacing Pixels between items, horizontally
             * @param vertical_spacing   Pixels between items, vertically
             */
            public LayoutParams(int horizontal_spacing, int vertical_spacing) {
                super(0, 0);
                this.horizontal_spacing = horizontal_spacing;
                this.vertical_spacing = vertical_spacing;
            }
        }
    
        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) - getPaddingLeft() - getPaddingRight();
            int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
            final int count = getChildCount();
            int line_height_space = 0;
    
            int xpos = getPaddingLeft();
            int ypos = getPaddingTop();
    
            int childHeightMeasureSpec;
            if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
                childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);
            } else {
                childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
            }
    
    
            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), childHeightMeasureSpec);
                    final int childw = child.getMeasuredWidth();
                    line_height_space = Math.max(line_height_space, child.getMeasuredHeight() + lp.vertical_spacing);
    
                    if (xpos + childw > width) {
                        xpos = getPaddingLeft();
                        ypos += line_height_space;
                    }
    
                    xpos += childw + lp.horizontal_spacing;
                }
            }
            this.line_height_space = line_height_space;
    
            if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
                height = ypos + line_height_space;
    
            } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
                if (ypos + line_height_space < height) {
                    height = ypos + line_height_space;
                }
            }
            setMeasuredDimension(width, height);
        }
    
        @Override
        protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
            return new LayoutParams(1, 1); // default of 1px spacing
        }
    
        @Override
        protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
            if (p instanceof LayoutParams) {
                return true;
            }
            return false;
        }
    
        @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_space;
                    }
                    child.layout(xpos, ypos, xpos + childw, ypos + childh);
                    xpos += childw + lp.horizontal_spacing;
                }
            }
        }
    }
    

    Example :

    text_view.xml

    
    
    
        
    
    

    activity_flow_layou_demo.xml

    
    
        
    
            
    
                
    
                    
    
                    
    
                    
                
    
                
    
                    
    
                    
    
                    
                
            
        
    
    

    FlowLayouDemo.java

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    
    public class FlowLayouDemo extends AppCompatActivity {
        private TextView tvTitleBusiness;
        private FlowLayout flowBusiness;
        private TextView tvTitlePrivate;
        private FlowLayout flowPrivate;
        private ArrayList arrayList;
    
        private void findViews() {
            tvTitleBusiness = (TextView) findViewById(R.id.tvTitleBusiness);
            flowBusiness = (FlowLayout) findViewById(R.id.flowBusiness);
            tvTitlePrivate = (TextView) findViewById(R.id.tvTitlePrivate);
            flowPrivate = (FlowLayout) findViewById(R.id.flowPrivate);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_flow_layou_demo);
            findViews();
            addLayouts();
        }
    
        private void addLayouts() {
            if (arrayList == null) {
                arrayList = new ArrayList<>();
            }
            flowBusiness.removeAllViews();
            flowPrivate.removeAllViews();
            for (int i = 0; i < 75; i++) {
    
                final boolean[] selected = {false};
                View view = this.getLayoutInflater().inflate(R.layout.text_view, null);
                final TextView textView = (TextView) view.findViewById(R.id.tvText);
                if (i % 5 == 0) {
                    arrayList.add(new TagModel(i, false, "Business VIEW : " + i));
                    textView.setText("Busi VIEW To  IS : " + i);
                } else {
                    arrayList.add(new TagModel(i, false, "TEXT IS : " + i));
                    textView.setText("Busi IS : " + i);
                }
                textView.setBackgroundResource(R.drawable.unselected_tag);
                textView.setTextColor(Color.parseColor("#3F51B5"));
                textView.setTag(i);
                if(i<=50){
                    flowBusiness.addView(view);
                }else {
                    textView.setText("Priv View : "+i);
                    flowPrivate.addView(view);
                }
    
                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (selected[0]) {
                            selected[0] = false;
                            textView.setBackgroundResource(R.drawable.unselected_tag);
                            textView.setTextColor(Color.parseColor("#3F51B5"));
                        } else {
                            selected[0] = true;
                            textView.setBackgroundResource(R.drawable.selected_tag);
                            textView.setTextColor(Color.parseColor("#FFFFFF"));
                        }
                    }
                });
    
            }
        }
    }
    

提交回复
热议问题