web-dev-qa-db-ja.com

プログラムでTextViewをグリッドレイアウトの配置に追加するのは適切ではありません

こんにちは私はdrawableLeftを使用してTextViewをGridLayoutに追加しようとしています。このTextViewをループに追加しています。 TextViewは正しく追加されていますが、正しく配置されていません。各テキストビューは、発生していない1つの水平行で同じ幅を取る必要があります。

以下は私が使用しているコードです

    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
silentsudo

このためには、ビューの列幅を動的に設定する必要があります。これにより、最終的に各ビューが同じ量のスペースに適切に配置されます。

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);

} 
5

基本的に、それは列と行の数です。完全なロジックを書き直しました

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);
    } 
1

これは、動的テキストの長さが固定されていないため、各テキストビューが同じスペースをとらないことが原因である可能性があります これを確認してください

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));

0
Ajay Pandya

次のコードサンプルでは、​​各テキストビューの高さと幅を等しくし、TextViewを左から右、次に上から下に並べます。

重要な部分は、GridLayout.LayoutParamsを明示的に提供し、高さ/幅を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);
} 
0
Dean Gurvitz