TableLayout: Zeilen generieren und anfügen


#1

Hi, ich will dynamisch Zeilen in eine TableLayout ein- / anfügen.
Mein Code sieht so aus:


	protected TableLayout tbl;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.d(TAG, "onCreate");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.doser_setup_log);
		
		tbl = (TableLayout) findViewById(R.id.tbl_view_list);
		
		List<ViewFillingDataset> listeFillings = act.getListViewFilling(this);
		ViewFillingDataset viewFillingDataset = null;
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        tr.setGravity(Gravity.CENTER_VERTICAL);
		for (int i=0; i < listeFillings.size(); i++){
			viewFillingDataset = listeFillings.get(i);
			
			TextView txv = new TextView(this);
			txv.setId(i);
			Drawable img = getBaseContext().getResources().getDrawable(android.R.drawable.ic_menu_more);
			txv.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null);
			txv.setText("Text");
			txv.setOnClickListener(onClickListener);
			
			CheckBox chb = new CheckBox(this);
			chb.setId(i);
						
			tr.addView(txv);
			tr.addView(chb);
		}
		tbl.addView(tr);  ...} ...}```

Was passiert ist, dass die Zeilen nebeneinander dargestellt werden, wovon ich aber nur 1,5 Zeilen sehe, da der Platz nicht breiter ist.
[B]Natürlich sollen die Zeilen untereinander. Aber das bekomme ich nicht hin und möchte deshalb fragen, ob mir jemand weiterhelfen kann?![/B]
Nach meiner Logik müsste die letzte Zeile tbl.addView(tr) in die for Schleife, weil ja jede darin erzeugte Zeile nacheinander angefügt werden soll.
Aber dies erzeugt leider eine Fehlermeldung.

> E/AndroidRuntime(28643): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.


Ich denke mir, ich muss womöglich die Zeilen tr in irgend etwas reinpacken, in eine Liste oder so, und diese dann an tbl anhängen. Aber trotz Rumprobierens habe ich keine Lösung gefunden.
Über Hilfe und sachdienliche Hinweise würde ich mich freuen.

#2

[QUOTE=frankmehlhop;68228]Was passiert ist, dass die Zeilen nebeneinander dargestellt werden, wovon ich aber nur 1,5 Zeilen sehe, da der Platz nicht breiter ist.[/QUOTE]
Du verwendest ja auch immer die selbe TableRow. Wenn dann müsstest Du in der Schleife pro Durchgang eine neue TableRow erzeugen.

[QUOTE=frankmehlhop;68228]Hi, ich will dynamisch Zeilen in eine TableLayout ein- / anfügen.[/QUOTE]
Für mich sieht es so aus, als ob hier eine ListView mit passendem Adapter, die bessere Lösung wäre.


#3

Vielen Dank Michael,

und für alle, die auch hier auf der Suche nach einer Lösung ankommen, mein Code:

	protected void onCreate(Bundle savedInstanceState) { ...

		
		ll_list_fillings = (LinearLayout) findViewById(R.id.ll_list);
		List<ViewFillingDataset> listeFillings = act.getListViewFilling(this);
		ViewFillingDataset viewFillingDataset = null;	
		for (int i=0; i < listeFillings.size(); i++){
			viewFillingDataset = listeFillings.get(i);
			
			LinearLayout ll_row = new LinearLayout(this);
			ll_row.setOrientation(LinearLayout.HORIZONTAL);			
			
			LinearLayout ll_as_btn = new LinearLayout(this);
			ll_as_btn.setOrientation(LinearLayout.HORIZONTAL);
			ll_as_btn.setId(i);
			
			TextView txvImgAndProfileName = new TextView(this);
			txvImgAndProfileName.setLayoutParams(new ViewGroup.LayoutParams(170, LayoutParams.WRAP_CONTENT));
			txvImgAndProfileName.setGravity(Gravity.CENTER_VERTICAL);
			Drawable img = getBaseContext().getResources().getDrawable(android.R.drawable.ic_menu_more);
			txvImgAndProfileName.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null);
			txvImgAndProfileName.setText( "   " + viewFillingDataset.getName() );
			ll_as_btn.addView(txvImgAndName);

			TextView txvAmount = new TextView(this);
			txvAmount.setLayoutParams(new ViewGroup.LayoutParams(80, LayoutParams.WRAP_CONTENT));
			txvAmount.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
			txvAmount.setText(viewFillingDataset.getAmount());
			ll_as_btn.addView(txvAmount);
			
			TextView txvNumber = new TextView( this );
			txvNumber.setLayoutParams(new ViewGroup.LayoutParams(80, LayoutParams.WRAP_CONTENT));
			txvNumber.setGravity( Gravity.RIGHT | Gravity.CENTER_VERTICAL );
			txvNumber.setText( String.valueOf(viewFillingDataset.getNumber()) );
			ll_as_btn.addView( txvNumber );
			
			ll_as_btn.setOnClickListener(onClickListener);
			
			CheckBox chb = new CheckBox(this);
			chb.setId(i);
			chb.setLayoutParams(new ViewGroup.LayoutParams(30, LayoutParams.WRAP_CONTENT));
			chb.setGravity(Gravity.RIGHT);
						
			ll_row.addView(ll_as_btn);
			ll_row.addView(chb);
			ll_list_fillings.addView(ll_row);
		} ... ```

Die CheckBox klebt noch zu sehr am letzten TextView, aber das sollte ich auch gleich optimiert haben. ;)