2009-09-12 4 views
1

J'ai un LinearLayout défini en XML que je veux utiliser à plusieurs reprises pour afficher les éléments d'une liste. Le XML de mise en page ressemble à ceci:Problèmes d'affichage de la mise en page basée sur XML et ajout dynamique de texte

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:background="@drawable/background" 
android:paddingBottom="5px" 
> 
<TextView 
android:id="@+id/destination" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:textSize="22dp" 
android:text="@string/test_destination" 
android:paddingLeft="5px" 
/> 

<TextView 
android:id="@+id/date" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:textSize="15dp" 
android:text="@string/test_date" 
android:paddingLeft="5px" 
/> 

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/info" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:paddingLeft="5px" 
android:paddingTop="10px" 
> 
    <TableRow> 
     <TextView 
      android:id="@+id/reg_label" 
      android:gravity="right" 
      android:paddingRight="5px" 
      android:text="@string/reg_label" /> 
     <TextView 
      android:text="@string/test_registered"/> 
    </TableRow> 
    <TableRow> 
     <TextView 
      android:id="@+id/info_label" 
      android:gravity="right" 
      android:paddingRight="5px" 
      android:text="@string/info_label" /> 
     <TextView 
      android:text="@string/test_info"/> 
    </TableRow> 
</TableLayout> 
</LinearLayout> 

Je recueille des informations de certains événements d'une page Web, et je veux afficher tous les événements dans une liste en utilisant la disposition ci-dessus pour chaque événement. Mon approche actuelle consiste à avoir un LinearLayout en tant que parent, puis à ajouter chaque événement en tant que ligne.

Le problème numéro un est d'ajouter la disposition à chaque événement (le nombre d'événements varie). C'est-à-dire, je veux gonfler dynamiquement cette disposition pour chaque événement. Je ne veux pas non plus que le texte soit codé en dur dans la mise en page (comme ci-dessus) mais ajouté au moment de l'exécution. Je ne sais pas comment faire ça. J'ai essayé quelque chose comme ce qui suit sans succès. Le problème numéro deux consiste alors à ajouter ces dispositions au groupe de vues parent et à les afficher à l'écran. Lorsque j'essaie de faire cela en utilisant parent.addView (child), le programme se bloque à l'exécution et je n'arrive pas à comprendre pourquoi.

C'est un peu difficile de décrire le problème spécifique, étant donné que je suis nouveau à la programmation graphique sur Android et que je suis en train de programmer par essais et erreurs en ce moment. Quoi qu'il en soit, si vous êtes en mesure de m'aider avec certains des problèmes, il serait grandement apprécié.

Linus

EDIT:

Merci commonsware, maintenant les vues gonflent correctement. Le problème est maintenant d'ajouter du texte dynamiquement aux TextViews. J'essaie ceci:

TextView dest = (TextView) findViewById(R.id.destination); 
dest.setText("myText"); 

seulement pour découvrir que dest est nulle. Des idées pourquoi et comment résoudre ce problème?

EDIT 2:

J'ai réduit le problème encore plus, mais je ne comprends vraiment pas sa nature. Ceci est la peine méthode:

private void formatEvents(ArrayList<Event> events, LinearLayout parentView) { 
    Log.d(TAG, "formatEvents, size: " + events.size()); 
    for (Event event : events) { 

     LinearLayout eventView = new LinearLayout(this); 
     eventView = (LinearLayout) getLayoutInflater().inflate(R.layout.event, null); 
     parentView.addView(eventView); 

     TextView dest = (TextView) findViewById(R.id.destination); 
     TextView date = (TextView) findViewById(R.id.date); 
     TextView registered = (TextView) findViewById(R.id.registered); 
     TextView info = (TextView) findViewById(R.id.info); 
     if (dest == null) 
      Log.d(TAG, "null"); 
     else { 
      Log.d(TAG, "not null"); 
      dest.setText(event.getDestination()); 
      date.setText(event.getDate()); 
      registered.setText(event.getDriver() + " " + event.getPassengers()); 
      info.setText(event.getInfo()); 
     } 
    }  
} 

Je reçois nulle pour la première itération, mais pas pour le second. Quand je change

parentView.addView(eventView); 

à

parentView.addView(eventView, 0); 

cela fonctionne en quelque sorte (même si les événements sont affichés dans l'ordre inverse). Quelqu'un sait ce qui se passe ici?

Répondre

1

Est id "destination" appartient à la mise en page "événement"?

Si tel est le cas,

TextView dest = (TextView) findViewById(R.id.destination);
devrait être

TextView dest = (TextView) eventView.findViewById(R.id.destination); 
+0

parfait, merci! – aspartame

1

Dans l'ensemble, je vous recommande d'utiliser un ListView plutôt qu'un LinearLayout comme conteneur pour vos lignes.

problème numéro un est d'ajouter la mise en page à chaque événement (le nombre d'événements varie). Par exemple, je souhaite gonfler dynamiquement cette disposition pour chaque événement.

parentView.addView(getLayoutInflater().inflate(R.layout.this_is_my_row)); 
Questions connexes