2016-04-27 13 views
0

私はこの(RTL)のようなものを実装したい:レイアウトにビューを追加することができること、言い換えればクラッシュ(アンドロイド)

enter image description here

を3列。 私はこれをやってみました:

my_fragment.xml:

... 
<TableLayout 
      android:id="@+id/myTable" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:numColumns="3" 
      android:stretchColumns="*" 
      android:layout_margin="10dp" 
      android:background="@color/background_color"> 
     </TableLayout > 
... 

myFragment.java:

TableRow[] tableRows = new TableRow[ serverResponse.getData().size()/3 ]; 
    for(int i=0, j=0; i<serverResponse.getData().size() ;i++) 
    { 
     View customView = inflater.inflate(R.layout.data_item, tableRows[j], true); 
     ((TextView) customView.findViewById(R.id.viewText)).setText(serverResponse.getData().get(i).getItemData()); 
     if(i%3 == 0) { 
      j++; 
     } 

     myTable.addView(tableRows[i] , new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT)); 
    } 

をクラッシュ:Cannot add a null child view to a ViewGroup

EDIT:マイク・M.へ 感謝」今のところうまくいきます。しかし、一つの列は常にカットされています enter image description here

data_item.xmlは単純です:あなたはTableRow配列の個々の要素を初期化していないので、あなたはそのエラーを取得している

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="right"> 

    <TextView 
     android:id="@+id/viewText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:ellipsize="end"/> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:layout_marginLeft="8dp" 
     android:background="@drawable/circle"/> 

</LinearLayout> 
+0

'TableRow'の配列を初期化しようとしていますが、個々の要素を初期化していないので' null'です。 –

+0

私は混乱しています..要素は、 "inflate"部分で発生するcustomViews ..を受け取る必要があります。いいえ? – BVtp

+0

'Object'の配列の各要素を初期化する必要があります。配列を初期化すると、各要素は 'null'になります。つまり、新しい行ごとに 'new TableRow(getContext())'を呼び出す必要があります。また、あなたのロジックはあなたのテーブルを作成するための少しオフです。 2つのネストされた 'for'ループを使う方が良いでしょう。 –

答えて

1

。配列自体を初期化しても要素は初期化されません。つまり、配列インデックスごとに新しいTableRowをインスタンス化する必要があります。

addView()メソッドを使用してTableRowにセルを追加する必要があります。セルを追加する代わりに、または新しいセルごとに行全体を占有する必要があります。 data_itemレイアウトで

final int size = serverResponse.getData().size(); 
final int numCols = 3; 
final int numRows = size/numCols + (size % numCols == 0 ? 0 : 1); 
final TableRow[] tableRows = new TableRow[numRows]; 

final TableLayout.LayoutParams tableParams = 
    new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, 
           TableLayout.LayoutParams.WRAP_CONTENT); 
final TableRow.LayoutParams rowParams = 
    new TableRow.LayoutParams(0, 
           TableRow.LayoutParams.WRAP_CONTENT, 
           1); 

for (int i = 0; i < numRows; i++) { 
    tableRows[i] = new TableRow(getContext()); 
    for (int j = 0; j < numCols; j++) { 
     final int index = i * numCols + j; 
     final View customView = inflater.inflate(R.layout.data_item, 
               tableRows[i], false); 
     if (index < size) { 
      ((TextView) customView.findViewById(R.id.noteText)) 
       .setText(serverResponse.getData().get(index).getItemData()); 
     } 
     else { 
      ((ImageView) customView.findViewById(R.id.circle)) 
       .setVisibility(View.INVISIBLE); 
     } 
     tableRows[i].addView(customView, rowParams); 
    } 
    myTable.addView(tableRows[i], tableParams); 
} 

ImageViewcircleのIDを設定します。

+0

ありがとうございました!それは動作するようです。 もう1つ、実際にはデフォルトLTRの代わりにRTLを作成することができます(右から左に書く言語をサポートする場合、実際には整列の問題であっても、見た目が崩れて切り詰められているように見えます)。 – BVtp

+0

また、膨張する部分で最後のパラメータが「false」になる必要があるのはなぜですか? – BVtp

+0

重力が「右」になるようにdata_itemレイアウトを変更しました。それは今すぐそれを整列させるが、それはカットされています。列は同じサイズではありません。 – BVtp

関連する問題