以编程方式将TextView添加到网格布局对齐不正确

时间:2016-02-29 06:10:17

标签: android dynamic android-gridlayout

您好我正在尝试将带有drawableLeft的TextView添加到GridLayout。 我在循环中添加此TextView。 TextView正在添加正确但未正确对齐。每个textview应该在一个水平行中采用相同的宽度,这是没有发生的。

以下是我正在使用的代码

    GridLayout gridLayout = new GridLayout(getContext());
            gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
            gridLayout.setColumnCount(2);
            gridLayout.setRowCount(3);
            TextView titleText;
            for (int i = 0; facilities != null && i < facilities.size(); i++) {
                titleText = new TextView(getContext());
                titleText.setText(facilities.get(i));
                gridLayout.addView(titleText, i);
                titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);
}

4 个答案:

答案 0 :(得分:2)

为此,您必须动态设置视图的列宽。这将最终使用相等的空间正确对齐每个视图。

GridLayout gridLayout = new GridLayout(getContext());
            gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
            gridLayout.setColumnCount(2);
            gridLayout.setRowCount(3);
            TextView titleText;
            for (int i = 0; facilities != null && i < facilities.size(); i++) {
                titleText = new TextView(getContext());
                titleText.setText(facilities.get(i));
                gridLayout.addView(titleText, i);
                titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);
                GridLayout.LayoutParams param =new GridLayout.LayoutParams();
                param.height = LayoutParams.WRAP_CONTENT;
                param.width = LayoutParams.WRAP_CONTENT;
                param.rightMargin = 5;
                param.topMargin = 5;
                param.setGravity(Gravity.CENTER);
                param.columnSpec = GridLayout.spec(c);
                param.rowSpec = GridLayout.spec(r);
                titleText.setLayoutParams (param);

} 

答案 1 :(得分:1)

基本上就是列数和行数。我已经重新编写了完整的逻辑

GridLayout gridLayout = new GridLayout(getContext());
    int total = facilities.size();
    int column =  2;
    int row = total / column;
    gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
    gridLayout.setColumnCount(column);
    gridLayout.setRowCount(row + 1);
    TextView titleText;
    for(int i =0, c = 0, r = 0; i < total; i++, c++)
    { 
        if(c == column)
        { 
            c = 0;
            r++;
        } 
         titleText = new TextView(getContext());
         titleText.setText(facilities.get(i));
         gridLayout.addView(titleText, i);
         titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);
         GridLayout.LayoutParams param =new GridLayout.LayoutParams();
         param.height = LayoutParams.WRAP_CONTENT;
         param.width = LayoutParams.WRAP_CONTENT;
         param.rightMargin = 5;
         param.topMargin = 5;
         param.setGravity(Gravity.CENTER);
         param.columnSpec = GridLayout.spec(c);
         param.rowSpec = GridLayout.spec(r);
         titleText.setLayoutParams (param);
    } 

答案 2 :(得分:0)

这可能是因为您的动态文字长度不固定,因此每个textview不占用相同的空格Check this

int height=getContext().getResources().getDimension(R.dimen.activity_horizontal_margin); //set size of dimen in required resolution

titleText .setLayoutParams(new LinearLayout.LayoutParams(0,height,height));

答案 3 :(得分:0)

以下代码示例应为每个文本视图赋予相同的高度和宽度,并按从左到右的顺序排列TextView,然后从上到下进行排序。

关键部分是显式提供GridLayout.LayoutParams,将height / width设置为0,并定义权重设置为1的行/列规范,以便根据权重自动计算高度和宽度。

还请注意,我将行数设置为设施数量的函数,这样,如果您的列表增加,您将拥有更多行。

if (facilities == null) {
    // In this case there is nothing to display. You can adjust this part to your needs.
    return;
}

GridLayout gridLayout = new GridLayout(getContext());
gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
gridLayout.setColumnCount(2);
gridLayout.setRowCount(facilities.size() / 2);
for (int i = 0; i < facilities.size(); i++) {
    TextView titleText = new TextView(getContext());
    titleText.setText(facilities.get(i));
    titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);

    GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
    layoutParams.height = 0;
    layoutParams.width = 0;
    int currentCol = i % 2;
    int currentRow = i / 2;
    // The last parameter in the specs is the weight, which gives equal size to the cells
    layoutParams.columnSpec = GridLayout.spec(currentCol, 1, 1);
    layoutParams.rowSpec = GridLayout.spec(currentRow, 1, 1);

    // Optional, if you want the text to be centered within the cell
    layoutParams.setGravity(Gravity.CENTER);

    gridLayout.addView(titleText, layoutParams);
}