2016-04-27 3 views
0

Ich mag so etwas wie diese (RTL) implementieren:Absturz versucht Blick auf eine Tabelle hinzuzufügen, dynamisch (Android)

enter image description here

Mit anderen Worten, Ansichten in der Lage, in dem ein Layout in 3 Spalten. Ich habe versucht, dies zu tun:

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

Crash: Cannot add a null child view to a ViewGroup

EDIT: dank Mike M.‘ s Lösung funktioniert es jetzt. Jedoch wird eine Spalte immer geschnitten: enter image description here

Die data_item.xml ist einfach:

<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

Sie initialisieren das Array von 'TableRow's, aber Sie initialisieren nicht die einzelnen Elemente, also sind sie' null'. –

+0

Ich bin verwirrt .. die Elemente sollten die customViews erhalten .. was passiert im "inflat" Teil. Nein? – BVtp

+0

Jedes Element in einem Array von Objekten muss initialisiert werden. Wenn Sie das Array gerade initialisieren, ist jedes Element "null". Das heißt, Sie müssen 'new TableRow (getContext())' für jede neue Zeile aufrufen. Außerdem ist Ihre Logik für die Erstellung Ihres Tisches nicht optimal. Sie verwenden zwei verschachtelte For-Loops besser. –

Antwort

1

Sie diesen Fehler bekommen, weil Sie nicht die einzelnen Elemente Ihrer TableRow Array initialisiert. Das Initialisieren des Arrays selbst initialisiert die Elemente nicht. Das heißt, Sie müssen einen neuen TableRow für jeden Array-Index instanziieren.

Sie müssen auch die Zellen zu jedem TableRow mit der addView() Methode, anstatt sie aufblasen, oder jede neue Zelle mit der gesamten Zeile belegen.

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

Im data_item Layout einstellen eine ID von circle auf der ImageView.

+0

Danke! Es scheint zu funktionieren. Nur noch eine Sache, wenn ich darf: Wie kann ich RTL statt der Standard-LTR machen (wenn man Sprachen von rechts nach links unterstützt, scheint es unordentlich und schneidend, sogar tatsächlich ist es nur eine Frage der Ausrichtung). – BVtp

+0

Warum muss der letzte Parameter im Aufblasteil auch "falsch" sein? – BVtp

+0

Ich änderte das data_item-Layout so, dass die Schwerkraft "richtig" wäre. Es richtet es jetzt aus, aber es ist geschnitten. und die Spalten haben nicht die gleiche Größe. – BVtp

Verwandte Themen