2013-03-29 6 views
2

Je réalise une requête HTTP et obtient des résultats. Ensuite, je veux faire défiler ces résultats et de créer les éléments suivants pour chaque résultat: (RL = Disposition relative)Conteneur Android par programme

enter image description here

Une disposition relative (RL dans la photo) avec un TextView et un ImageView à l'intérieur . Je veux ensuite ajouter tous ces «conteneurs» à une liste et les transmettre pour interprétation. Je souhaite essentiellement créer un conteneur par programme, y placer deux éléments et l'envoyer pour un traitement ultérieur.

(Est-ce possible, ou est-il une meilleure façon de le faire?) * ÉDITÉ

Merci d'avance pour toute aide, j'ai passé beaucoup de temps sur ce déjà


* Je l'ai essayé, il lance une exception en essayant de passer la liste des mises en page Je pense que


simplement ajouter plus ici:

public void send(List<RelativeLayout> containers) { 

     for(int i=0; i<containers.size(); i++){ 
      RelativeLayout rl = new RelativeLayout(mContext); 
      rl = containers.get(i); 
      icons_row.addView(rl); 
     } 
    } 

Et l'exception

03-29 10:20:32.290: E/AndroidRuntime(29782): FATAL EXCEPTION: main 
03-29 10:20:32.290: E/AndroidRuntime(29782): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
03-29 10:20:32.290: E/AndroidRuntime(29782): at android.view.ViewGroup.addViewInner(ViewGroup.java:3618) 
03-29 10:20:32.290: E/AndroidRuntime(29782): at android.view.ViewGroup.addView(ViewGroup.java:3489) 
03-29 10:20:32.290: E/AndroidRuntime(29782): at android.view.ViewGroup.addView(ViewGroup.java:3434) 
03-29 10:20:32.290: E/AndroidRuntime(29782): at android.view.ViewGroup.addView(ViewGroup.java:3410) 

Répondre

1

Alrighty ici nous allons. Gardez à l'esprit que ceci est fait après une Requête HTTP, donc c'est l'implémentation d'une Tâche Asynchrone, j'ai juste laissé de côté ce bit car ce n'est pas pertinent pour la question que j'avais.

D'abord, créez 3 listes de choses. 1 Liste des mises en page (le conteneur de type div externe), 1 liste de vues de texte et 1 liste d'images vues. Pour mon exemple, je mis en boucle une liste de ma propre classe entreprise appelée:

private List<RelativeLayout> layoutContainers = new ArrayList<RelativeLayout>(); 
private List<TextView> textContainers = new ArrayList<TextView>(); 
private List<ImageView> imageContainers = new ArrayList<ImageView>(); 

.... 

@Override 
protected void onPostExecute(List<Business> blist){ 

    for(int i=0;i<blist.size();i++){ 

    RelativeLayout newLayout = new RelativeLayout(mContext); 

    TextView tv = new TextView(mContext); 
    ImageView iv = new ImageView(mContext); //// or getApplicationContext() 

    tv.setId(1); iv.setId(2); 

    newLayout.addView(tv); 
    newLayout.addView(iv); 
    icons_row.addView(newLayout); // this is another relative layout created via XML as standard 


    RelativeLayout.LayoutParams layoutParms = (RelativeLayout.LayoutParams)newLayout.getLayoutParams(); 
    RelativeLayout.LayoutParams textParms = (RelativeLayout.LayoutParams)tv.getLayoutParams(); 
    RelativeLayout.LayoutParams imageParms = (RelativeLayout.LayoutParams)iv.getLayoutParams(); 

    layoutParms.height = RelativeLayout.LayoutParams.MATCH_PARENT; 
    layoutParms.width = 175; 
    newLayout.setGravity(Gravity.CENTER_VERTICAL); 

    // Text Styling   
    textParms.height = RelativeLayout.LayoutParams.WRAP_CONTENT; 
    textParms.width = RelativeLayout.LayoutParams.MATCH_PARENT; 
    tv.setBackgroundColor(R.drawable.my_border); 
    tv.setPadding(1, 5, 1, 2); 
    tv.setTextColor(Color.GREEN); 
    tv.setGravity(Gravity.CENTER_HORIZONTAL); // center text 

    // Image Styling - background set deeper inside   
    imageParms.addRule(RelativeLayout.BELOW, tv.getId()); 
    imageParms.setMargins(35, 0, 0, 0); 
    imageParms.height = RelativeLayout.LayoutParams.WRAP_CONTENT; 
    imageParms.width = RelativeLayout.LayoutParams.WRAP_CONTENT; 

    // set the params 
    tv.setLayoutParams(textParms); 
    iv.setLayoutParams(imageParms); 
    newLayout.setLayoutParams(layoutParms); 

    // add them to the lists (created above) 
    textContainers.add(tv); 
    imageContainers.add(iv); 
    layoutContainers.add(newLayout); 
      } 

     bearingTextView = (TextView)findViewById(R.id.bearingTextView); 
     gps.calculateBearing(compass, bearingTextView ,blist, textContainers, imageContainers,layoutContainers); 

} // end on Post Execute 

Je leur ai envoyé par mon GPS qui les avait envoyés à ma boussole. Pour apporter des modifications, par exemple, mettre à jour le texte, vous faites ce qui suit ... Prenant par exemple, la méthode calculateBearing indiquée ci-dessus ... En ignorant les autres valeurs, juste les conteneurs.


public class Gps{ 
    private List<TextView> textContainers; 
    private List<ImageView> imageContainers; 
    private List<RelativeLayout> layoutContainers; 

... 

public void calculateBearing(Compass compass, TextView bearingText, List<Business> blist,     List<TextView> textContainers,List<ImageView> imageContainers,List<RelativeLayout> layoutContainers){ 
    this.textContainers = textContainers; 
    this.imageContainers = imageContainers; 
    this.layoutContainers = layoutContainers; 

    //eg. change the text 
     for(int i=0; i<textContainers.size(); i++){ 
     textContainers.get(i).setText("This is text field: " + Integer.toString(i)); // will return, 1,2,3 etc depending on whatever textField is there 
    } 

    } 
} 

Gardez à l'esprit que j'appelle ces méthodes externes de onPostExecute, de sorte que l'interface utilisateur sera mis à jour. Si je n'étais pas clair sur quoi que ce soit, faites-le moi savoir

Questions connexes