Search code examples
androidandroid-tablelayout

Dynamic table, cols width doesn't match header


I'm trying to build a dynamic filled table. I've got that, but my problem is that the added cells doesn't match the width of the header-cols.

My table

How can I achieve this?

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:orientation="horizontal" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/txtError"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            android:textSize="25sp" />

        <TableLayout
            android:id="@+id/timelineTable"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/txtError"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"
            android:background="#000000" >

            <TableRow
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_margin="0.5dp"
                android:background="@android:color/black"
                android:textAlignment="center" >

                <TextView
                    android:id="@+id/txtHeaderDate"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".20"
                    android:background="@drawable/cell_shape"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="@string/TimelineHeaderDate"
                    android:textSize="20sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/txtHeaderType"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".20"
                    android:background="@drawable/cell_shape"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="@string/TimelineHeaderType"
                    android:textSize="20sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/txtHeaderValue"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".20"
                    android:background="@drawable/cell_shape"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="@string/TimelineHeaderValue"
                    android:textSize="20sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/txtHeaderUnit"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".15"
                    android:background="@drawable/cell_shape"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="@string/TimelineHeaderUnit"
                    android:textSize="20sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/txtHeaderComment"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".25"
                    android:background="@drawable/cell_shape"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="@string/TimelineHeaderComment"
                    android:textSize="20sp"
                    android:textStyle="bold" />
            </TableRow>
        </TableLayout>
    </RelativeLayout>

</ScrollView>

Dynamic adding:

private void printTimeline() {
  Log.d(CLASSTAG, "printTimeline");

  TableLayout timelineTable = (TableLayout) ParentActivity.findViewById(R.id.timelineTable);

  Log.d(CLASSTAG, "we have: " + this.timelineEvents.size() + " events to add");

  for (PlantEvent event : this.timelineEvents) {

    TableRow tr = new TableRow(ParentActivity);
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    tr.setLayoutParams(lp);


    for (int j = 1; j <= 5; j++) {

      String text = "";
      switch (j) {
      case 1:
        text = TimeHelper.convertTime(event.getDate().getTime());
        break;
      case 2:
        text = event.getType();
        break;
      case 3:
        text = (event.getDetails().get("Value") != null) ? event
            .getDetails().get("Value") : "";
        break;
      case 4:
        text = (event.getDetails().get("Unit") != null) ? event
            .getDetails().get("Unit") : "";
        break;
      case 5:
        text = (event.getDetails().get("comment") != null) ? event
            .getDetails().get("comment") : "";
        break;

      }

      TextView txtField = new TextView(ParentActivity);
      txtField.setText(text);

      txtField.setBackgroundColor(Color.GRAY);
      txtField.setGravity(Gravity.CENTER);
      tr.addView(txtField);

      txtField.setLayoutParams(lp);

    }

    timelineTable.addView(tr);
  }

}    

Solution

  • Try This:

    private void printTimeline() {
        Log.d(CLASSTAG, "printTimeline");
    
        TableLayout timelineTable = (TableLayout) ParentActivity.findViewById(R.id.timelineTable);
    
        Log.d(CLASSTAG, "we have: " + this.timelineEvents.size() + " events to add");
    
        for (PlantEvent event : this.timelineEvents) {
    
          TableRow tr = new TableRow(ParentActivity);
          LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
          tr.setLayoutParams(lp);
    
          float []weights = {0.2f, 0.2f, 0.2f, 0.15f, 0.25f};
          Display display = getWindowManager().getDefaultDisplay(); 
          int width = display.getWidth();  // deprecated
    
          for (int j = 1; j <= 5; j++) {
    
            String text = "";
            switch (j) {
            case 1:
              text = TimeHelper.convertTime(event.getDate().getTime());
              break;
            case 2:
              text = event.getType();
              break;
            case 3:
              text = (event.getDetails().get("Value") != null) ? event
                  .getDetails().get("Value") : "";
              break;
            case 4:
              text = (event.getDetails().get("Unit") != null) ? event
                  .getDetails().get("Unit") : "";
              break;
            case 5:
              text = (event.getDetails().get("comment") != null) ? event
                  .getDetails().get("comment") : "";
              break;
    
            }
    
            TextView txtField = new TextView(ParentActivity);
            txtField.setText(text);
    
            txtField.setBackgroundColor(Color.GRAY);
            txtField.setGravity(Gravity.CENTER);
    
    
            TableRow.LayoutParams tlp = new TableRow.LayoutParams((int)(weights[j-1] * width), TableRow.LayoutParams.WRAP_CONTENT);
            txtField.setLayoutParams(tlp);
            tr.addView(txtField);
    
          }
    
          timelineTable.addView(tr);
        }
    
      }