Textview with long text pushes out other views in GridLayout despite ellipsize=end

前端 未结 14 2020
星月不相逢
星月不相逢 2020-12-24 01:19

My problem is very similar to How to get a layout where one text can grow and ellipsize, but not gobble up the other elements on the layout, but read on below why I can\'t u

14条回答
  •  醉酒成梦
    2020-12-24 01:50

    GridLayout is like the other things on Android : flawed by design.

    You will need a custom Layout, the following example will allow you to layout things like:

        [      label | short text     | very long label | short text     ]
    
        [ long label | very very very |           label | very long text ] 
        [            | long text      |                 |                ]
    
    
    
    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class TwoColumsGridLayout extends ViewGroup {
        private final List> rows;
        private int rowCount = 0;
        private int firstColumWidth;
        private int secondColumWidth;
        private int thirdColumWidth;
        private int fourthColumnWidth;
        private final List rowHeights = new ArrayList<>();
        private final List> cellHeights = new ArrayList<>();
        private final List firstCellsWidths = new ArrayList<>(4);
        private final List thirdCellsWidths = new ArrayList<>(4);
    
        public TwoColumsGridLayout(Context context, int rowCount) {
            super(context);
            rows = new ArrayList<>(rowCount);
        }
    
    
        public void add(Context ctx, TextView l1, View t1, TextView l2, View t2) {
            final List row = new ArrayList<>(4);
            row.add(l1);
            row.add(t1);
            row.add(l2);
            row.add(t2);
            rows.add(row);
            this.addView(l1);
            this.addView(t1);
            if (l2 != null)
                this.addView(l2);
            if (t2 != null)
                this.addView(t2);
            this.rowCount++;
        }
    
        public int getRowCount() {
            return rowCount;
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            int curLeft = 0;
            int curBottom;
            int curRight;
            int curTop = 0;
            int i = 0;
            for (List row : rows) {
                final int rowHeight = this.rowHeights.get(i);
                final List rowCellHeights = this.cellHeights.get(i);
                final View v0 = row.get(0);
                curLeft = 0;
                curRight = curLeft + this.firstColumWidth;
                if (v0 != null) {
                    curBottom = curTop + rowCellHeights.get(0);
                    // Right align
                    v0.layout(curLeft + this.firstColumWidth - this.firstCellsWidths.get(i), curTop + 7, curRight, curBottom + 7);
                }
                //
                final View v1 = row.get(1);
                curLeft += this.firstColumWidth;
    
                curRight = curLeft + this.secondColumWidth;
                if (v1 != null) {
                    curBottom = curTop + rowCellHeights.get(1);
                    v1.layout(curLeft, curTop, curRight, curBottom);
                }
                //
                final View v2 = row.get(2);
                curLeft += this.secondColumWidth;
                curRight = curLeft + this.thirdColumWidth;
                if (v2 != null) {
                    curBottom = curTop + rowCellHeights.get(2);
                    // Right align
                    v2.layout(curLeft + this.thirdColumWidth - this.thirdCellsWidths.get(i), curTop + 7, curRight, curBottom + 7);
                }
                //
                final View v3 = row.get(3);
                curLeft += this.thirdColumWidth;
                curRight = curLeft + this.fourthColumnWidth;
                if (v3 != null) {
                    curBottom = curTop + rowCellHeights.get(3);
                    v3.layout(curLeft, curTop, curRight, curBottom);
                }
                curTop += rowHeight;
                i++;
            }
    
        } 
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            final int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
            // Compute first column width
            firstColumWidth = 0;
            for (List row : rows) {
                final View v = row.get(0);
                if (v != null) {
                    v.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                    measureChild(v, widthMeasureSpec, heightMeasureSpec);
                    final int w = v.getMeasuredWidth();
                    if (firstColumWidth < w) {
                        firstColumWidth = w;
                    }
                }
            }
            // Compute third column width
            thirdColumWidth = 0;
            for (List row : rows) {
                final View v = row.get(2);
                if (v != null) {
                    v.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                    measureChild(v, widthMeasureSpec, heightMeasureSpec);
                    final int w = v.getMeasuredWidth();
                    if (thirdColumWidth < w) {
                        thirdColumWidth = w;
                    }
                }
            }
            secondColumWidth = (parentWidth - firstColumWidth - thirdColumWidth) / 2;
            fourthColumnWidth = parentWidth - firstColumWidth - secondColumWidth - thirdColumWidth;
            // Clear
            this.rowHeights.clear();
            this.cellHeights.clear();
            this.firstCellsWidths.clear();
            this.thirdCellsWidths.clear();
            // Compute heights
            int height = 0;
            for (List row : rows) {
                final ArrayList rowCellHeights = new ArrayList<>(4);
                cellHeights.add(rowCellHeights);
                int rowHeight = 0;
                // First column
                final View v0 = row.get(0);
                if (v0 != null) {
                    int h = v0.getMeasuredHeight();
                    this.firstCellsWidths.add(v0.getMeasuredWidth());
                    rowCellHeights.add(h);
                    if (rowHeight < h) {
                        rowHeight = h;
                    }
                } else {
                    this.firstCellsWidths.add(0);
                }
                // Second column
                final View v1 = row.get(1);
                if (v1 != null) {
                    v1.setLayoutParams(new ViewGroup.LayoutParams(secondColumWidth, LayoutParams.WRAP_CONTENT));
                    measureChild(v1, widthMeasureSpec, heightMeasureSpec);
                    int h = v1.getMeasuredHeight();
                    rowCellHeights.add(h);
                    if (rowHeight < h) {
                        rowHeight = h;
                    }
                }
                // Third column
                final View v2 = row.get(2);
                if (v2 != null) {
                    int h = v2.getMeasuredHeight();
                    this.thirdCellsWidths.add(v2.getMeasuredWidth());
                    rowCellHeights.add(h);
                    if (rowHeight < h) {
                        rowHeight = h;
                    }
                } else {
                    this.thirdCellsWidths.add(0);
                }
                // Fourth column
                final View v3 = row.get(3);
                if (v3 != null) {
                    v3.setLayoutParams(new ViewGroup.LayoutParams(fourthColumnWidth, LayoutParams.WRAP_CONTENT));
                    measureChild(v3, widthMeasureSpec, heightMeasureSpec);
                    int h = v3.getMeasuredHeight();
                    rowCellHeights.add(h);
                    if (rowHeight < h) {
                        rowHeight = h;
                    }
                }
                height += rowHeight;
                this.rowHeights.add(rowHeight);
    
            }
            setMeasuredDimension(parentWidth, height);
        }
    }
    

    Have fun.

提交回复
热议问题