web-dev-qa-db-fra.com

Comment ajouter plusieurs fois la même vue au parent en la gonflant une seule fois

J'ai un LinearLayout avec une orientation verticale en tant que parent, je veux ajouter une vue par programme plusieurs fois à ce parent. En ce moment, je gonfle l'enfant à chaque fois que j'obtiens de nouvelles références à chaque élément de l'interface utilisateur avant de l'ajouter au parent. Cela ne semble pas très efficace, existe-t-il une meilleure façon de procéder?.

Le code actuel que j'utilise est ci-dessous, si je gonfle une seule fois avant pour la boucle, j'obtiens une erreur d'exécution "il a spécifié que l'enfant a déjà un parent. Vous devez d'abord appeler removeView () sur le parent de l'enfant".

        LayoutInflater inflator = LayoutInflater.from(getBaseContext());
        LinearLayout parentPanel = findViewById(R.id.parent_pannel);

        ArrayList<String> myList = getData();
        for(String data : myList) {
            // inflate child
            View item = inflator.inflate(R.layout.list_item, null);
            // initialize review UI
            TextView dataText = (TextView) item.findViewById(R.id.data);
            // set data
            dataText.setText(data);
            // add child
            parentPanel.addView(item);
        }
34
mkso

Avez-vous réellement vérifié si le gonflage est lent? Pour autant que je sache, le gonflage de la vue est très rapide (presque aussi rapide que la création de vues manuellement).

Il peut être surprenant que vous l'entendiez, mais gonfler n'analyse pas du tout les XML. Les XML pour la mise en page sont analysés et prétraités au moment de la compilation - ils sont stockés sous une forme binaire qui rend l'inflation des vues très efficace (c'est pourquoi vous ne pouvez pas gonfler une vue à partir d'un XML généré au moment de l'exécution).

28
Jarek Potiuk

Vous ne pouvez pas, même si vous essayez de créer un new view à partir de l'ancien objet view l'objet sera passé par référence et non par valeur, et donc vous obtiendrez un Exception comme childAlreadyHasParent, et ainsi, la seule façon est de mettre le view dans un for loop avec le nombre de fois que vous voulez qu'il soit gonflé, et cette boucle doit contenir le processus de création depuis le début non seulement les lignes de gonflage.

5
Muhammed Refaat

Je ne sais pas quel est votre point de vue mais l'avez-vous créé manuellement en gonflant le XML:

   ArrayList<String> myList = getData();
    for(String data : myList) {

        LinearLayout layout = new LinearLayout(this);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,             LayoutParams.WRAP_CONTENT));
        TextView textView = new TextView(this);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        textView.setText(data);

        layout.addChild(textView);         

        parentPanel.addView(layout);
    }

Mais oui, vous essayez clairement quelque chose qui a été fait pour vous avec Simple ListView & API

5
Blundell

Gonfler plusieurs fois ne peut pas être fait de la même manière en un seul coup. J'espère que cela fonctionne

LayoutInflater inflator = (LayoutInflater).getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    LinearLayout parentPanel = findViewById(R.id.parent_pannel);

    ArrayList<String> myList = getData();
    for(String data : myList) {
        // inflate child
        View item = inflator.inflate(R.layout.list_item, null);
        // initialize review UI
        TextView dataText = (TextView) item.findViewById(R.id.data);
        // set data
        dataText.setText(data);
        // add child
        parentPanel.addView(item);
    }

Cela fonctionnera, au moins m'a fonctionné

4
Sidharth