2013-08-13 20 views
18

Sto cercando di creare un layout in cui ho bisogno di aggiungere le righe della tabella in modo dinamico. Qui di seguito è il layout tabella XMLAggiunta di righe della tabella in modo dinamico in Android

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/displayLinear" 
    android:background="@color/background_df" 
    android:orientation="vertical" > 

     <TableRow 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/display_row" 
      android:layout_marginTop="280dip" > 

</TableLayout> 

Il file di attività in cui le righe vengono aggiunte in modo dinamico è

public void init(){ 
    menuDB = new MenuDBAdapter(this); 
    ll = (TableLayout) findViewById(R.id.displayLinear); 

    TableRow row=(TableRow)findViewById(R.id.display_row); 
    for (int i = 0; i <2; i++) { 

     checkBox = new CheckBox(this); 
     tv = new TextView(this); 
     addBtn = new ImageButton(this); 
     addBtn.setImageResource(R.drawable.add); 
     minusBtn = new ImageButton(this); 
     minusBtn.setImageResource(R.drawable.minus); 
     qty = new TextView(this); 
     checkBox.setText("hello"); 
     qty.setText("10"); 
     row.addView(checkBox); 
     row.addView(minusBtn); 
     row.addView(qty); 
     row.addView(addBtn); 
     ll.addView(row,i); 

    } 
} 

Ma quando ho eseguito questo, io sono sempre sotto l'errore

08-13 16:27:46.437: E/AndroidRuntime(23568): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roms/com.example.roms.DisplayActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

ho capito che questo è dovuto al comando ll.addView(row,i); ma quando lo rimuovo aggiunge tutte le cose in una singola riga piuttosto abbronzata creando una nuova riga per il prossimo oggetto. Ho provato anche a dare l'indice come row.addView(addBtn,i) ma non è ancora popolato correttamente. Si prega di avvisare. Grazie.

+0

Qui riga della tabella è già in file xml ... Quindi, prima aggiungi a livello di codice dovresti chiamare il metodo ll.removeallViews(). – Piyush

risposta

40

Non dovrebbe usare un elemento definito nel XML layout al fine di creare più istanze di esso. Dovresti crearlo in un XML separato e gonfiarlo o creare il TableRow in modo programmatico. Se la loro creazione programmaticaly, dovrebbe essere qualcosa di simile:

public void init(){ 
    TableLayout ll = (TableLayout) findViewById(R.id.displayLinear); 


    for (int i = 0; i <2; i++) { 

     TableRow row= new TableRow(this); 
     TableRow.LayoutParams lp = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT); 
     row.setLayoutParams(lp); 
     checkBox = new CheckBox(this); 
     tv = new TextView(this); 
     addBtn = new ImageButton(this); 
     addBtn.setImageResource(R.drawable.add); 
     minusBtn = new ImageButton(this); 
     minusBtn.setImageResource(R.drawable.minus); 
     qty = new TextView(this); 
     checkBox.setText("hello"); 
     qty.setText("10"); 
     row.addView(checkBox); 
     row.addView(minusBtn); 
     row.addView(qty); 
     row.addView(addBtn); 
     ll.addView(row,i); 
    } 
} 
+1

Molte grazie. Ha funzionato. – user2416087

+1

Si noti che è necessario impostare il layoutParams corretto per adattarlo alla descrizione nel proprio XML, nell'esempio non è completo per fare qualche ricerca :) – Fredigato

+0

Non funziona per me - non viene visualizzato nulla. – user3690202

3

codice di cambio di init come seguire,

public void init(){ 
    menuDB = new MenuDBAdapter(this); 
    ll = (TableLayout) findViewById(R.id.displayLinear); 
    ll.removeAllViews() 

    for (int i = 0; i <2; i++) { 
     TableRow row=(TableRow)findViewById(R.id.display_row); 
     checkBox = new CheckBox(this); 
     tv = new TextView(this); 
     addBtn = new ImageButton(this); 
     addBtn.setImageResource(R.drawable.add); 
     minusBtn = new ImageButton(this); 
     minusBtn.setImageResource(R.drawable.minus); 
     qty = new TextView(this); 
     checkBox.setText("hello"); 
     qty.setText("10"); 
     row.addView(checkBox); 
     row.addView(minusBtn); 
     row.addView(qty); 
     row.addView(addBtn); 
     ll.addView(row,i); 

    } 
+0

Grazie. Ho provato come suggerito, ma ora ricevo il punto null exception.08-13 16:56:14.727: E/AndroidRuntime (25623): java.lang.RuntimeException: impossibile avviare l'attività ComponentInfo {com.example.roms/com.example.roms.DisplayActivity}: java.lang.NullPointerException – user2416087

+0

inizializzare inizialmente tutte le visualizzazioni – mdDroid

48

Creare una funzione init() e puntare il layout della tabella. Quindi creare le righe e le colonne necessarie. Funzione

public void init() { 
      TableLayout stk = (TableLayout) findViewById(R.id.table_main); 
      TableRow tbrow0 = new TableRow(this); 
      TextView tv0 = new TextView(this); 
      tv0.setText(" Sl.No "); 
      tv0.setTextColor(Color.WHITE); 
      tbrow0.addView(tv0); 
      TextView tv1 = new TextView(this); 
      tv1.setText(" Product "); 
      tv1.setTextColor(Color.WHITE); 
      tbrow0.addView(tv1); 
      TextView tv2 = new TextView(this); 
      tv2.setText(" Unit Price "); 
      tv2.setTextColor(Color.WHITE); 
      tbrow0.addView(tv2); 
      TextView tv3 = new TextView(this); 
      tv3.setText(" Stock Remaining "); 
      tv3.setTextColor(Color.WHITE); 
      tbrow0.addView(tv3); 
      stk.addView(tbrow0); 
      for (int i = 0; i < 25; i++) { 
       TableRow tbrow = new TableRow(this); 
       TextView t1v = new TextView(this); 
       t1v.setText("" + i); 
       t1v.setTextColor(Color.WHITE); 
       t1v.setGravity(Gravity.CENTER); 
       tbrow.addView(t1v); 
       TextView t2v = new TextView(this); 
       t2v.setText("Product " + i); 
       t2v.setTextColor(Color.WHITE); 
       t2v.setGravity(Gravity.CENTER); 
       tbrow.addView(t2v); 
       TextView t3v = new TextView(this); 
       t3v.setText("Rs." + i); 
       t3v.setTextColor(Color.WHITE); 
       t3v.setGravity(Gravity.CENTER); 
       tbrow.addView(t3v); 
       TextView t4v = new TextView(this); 
       t4v.setText("" + i * 15/32 * 10); 
       t4v.setTextColor(Color.WHITE); 
       t4v.setGravity(Gravity.CENTER); 
       tbrow.addView(t4v); 
       stk.addView(tbrow); 
      } 

     } 

chiamata init nel metodo onCreate:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.activity_main); 

     init(); 
    } 

file di layout come:

<ScrollView 
     android:id="@+id/scrollView1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="#3d455b" 
     android:layout_alignParentLeft="true" > 

     <HorizontalScrollView 
      android:id="@+id/hscrll1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 

      <RelativeLayout 
       android:id="@+id/RelativeLayout1" 
       android:layout_width="fill_parent" 
       android:layout_gravity="center" 
       android:layout_height="fill_parent" 
       android:orientation="vertical" > 

       <TableLayout 
        android:id="@+id/table_main" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerHorizontal="true" > 
       </TableLayout> 
      </RelativeLayout> 
     </HorizontalScrollView> 
    </ScrollView> 

sarà simile:

enter image description here

+5

Lei signore, un risparmiatore di vita. Grazie ! –

+0

Grazie signore, lei salva il mio dy) – elik

7

Inoltre c e, come affermato da Fredigato, dichiarare uno RelativeLayout in un file di Layout separato. Poi un'istanza utilizzando:

for(int i = 0; i < 6; i ++){ 
LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE); 
RelativeLayout row = (RelativeLayout) inflater.inflate(R.layout.table_view,null); 
     quizesTableLayout.addView(row,i); 
} 

In questo approccio si può facilmente progettare fila uno personalizzato utilizzando XML e riutilizzarlo.

Ora, per essere in grado di modificare le viste figli nel RelativeLayout istanziato. È possibile chiamare row.childAt (indice).

Allora supponiamo di avere un TextView nel RelativeLayout, si può usare:

TextView tv = (TextView) row.childAt(0); 
tv.setText("Text"); 
+0

questa dovrebbe essere la soluzione selezionata. inoltre puoi usare row.findViewById() invece di childAt(). – SolidSnake

1
Activity 
    <HorizontalScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TableLayout 
      android:id="@+id/mytable" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

     </TableLayout> 
    </HorizontalScrollView> 

tua classe

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_testtable); 
    table = (TableLayout)findViewById(R.id.mytable); 
    showTableLayout(); 
} 


public void showTableLayout(){ 
    Date date = new Date(); 
    int rows = 80; 
    int colums = 10; 
    table.setStretchAllColumns(true); 
    table.bringToFront(); 

    for(int i = 0; i < rows; i++){ 

     TableRow tr = new TableRow(this); 
     for(int j = 0; j < colums; j++) 
     { 
      TextView txtGeneric = new TextView(this); 
      txtGeneric.setTextSize(18); 
      txtGeneric.setText(dateFormat.format(date) + "\t\t\t\t"); 
      tr.addView(txtGeneric); 
      /*txtGeneric.setHeight(30); txtGeneric.setWidth(50); txtGeneric.setTextColor(Color.BLUE);*/ 
     } 
     table.addView(tr); 
    } 
} 
Problemi correlati