8
votes

Ajouter des vues dans un ordre spécifique et stocker cet ordre

J'ai un bouton "Ajouter" et une gridlayout avec 6 emplacements, lorsque je clique sur le bouton "Ajouter", VIEW1 est ajouté dans le bouton GIDLAYOUT, je clique sur le bouton "Ajouter" à nouveau, voir la vue sur la vue2 est ajoutée, etc. .

if (prefs.getString("text4", null) != null) {
    Grid.addView(theLayout4);
}

if (prefs.getString("text5", null) != null) {
    Grid.addView(theLayout5);
}
// each view has one EditText


0 commentaires

5 Réponses :


1
votes

Le problème (au moins à partir de ce que j'ai compris de votre question) est que vous ne économisez pas dans les préférences une sorte d'indicateur pour la position de la vue dans son parent. À l'heure actuelle, il n'y a pas de différence entre l'ajout pour la première fois VS en ajoutant la vue après l'avoir supprimée ou entre l'ajout de la vue sur la machine à sous 1 VS 5 (par exemple). Un moyen de gérer cela serait d'avoir une entrée dans des préférences pour chacun de ces fentes, puis d'enregistrer dans ces préférences d'emplacement l'indicateur de vue:

Par exemple: p>

// in the activity:
// iterate over all the SLOT preferences
for (int i = 1; i <= 6; i++) {
   String text = prefs.getString(KEY_SLOT + i, null);
   // if text is null there is no view stored for this slot
   // keep in mind that you need to add some sort of empty widget to act as a child 
   // or modify the LayoutParams of the other children to take in consideration the empty space
   // OR
   // if text is one of your values, like text1, text2 etc
   // then you know that at slot i you need to place the view corresponding to the text value
}


0 commentaires

0
votes

Vous devez stocker le nom le nom de votre mise en page + un compteur. ex : Layout1, layout2, layout3 ...

Lorsque vous souhaitez les obtenir dans la commande, il vous suffit de boucler jusqu'à ce que vous n'ayez rien à récupérer: xxx

J'espère que cela aide!


2 commentaires

Ok, ça ne va pas ajouter les mises en page dans l'ordre (int) i? (Layout1 puis layout2 Puis layout 3 puis layout4 ...)


Vous pouvez ajouter les mises en page dans l'ordre de quoi vous voulez! La partie importante n'est que pour les récupérer dans le bon ordre.



1
votes

Cela se résume à l'insertion d'éléments dans une matrice triée. Il y a une méthode addview (voir enfant, int index) code> qui ajoutera la vue à la position souhaitée, ce que vous voulez utiliser. Vous aurez besoin de itérus sur les enfants actuellement ajoutés et de trouver l'index correct sur lequel insérer le nouveau. Si vous marquez chaque vue avec sa valeur avant de l'ajouter, vous pouvez regarder les balises pour déterminer où cet index est.

if (!theLayout1.isShown()) {
    insertView(theLayout1, 1);
} else if (!theLayout2.isShown()) {
    insertView(theLayout2, 2);
} else if (!theLayout3.isShown()) {
    insertView(theLayout3, 3);
}


5 commentaires

Je reçois un nullpointer quand j'essaie d'ajouter une vue après le retrait: java.lang.nullPointereException: tentative d'invoquer la méthode virtuelle 'int java.lang.integer.IntValue ()' sur une référence d'objet null


Cela signifie que la vue n'a pas son jeu de balises, ce qui est probablement parce que vous avez ajouté la vue sur le conteneur directement au lieu d'utiliser inserView .


J'ai utilisé inserView


En quelque sorte, la vue a été ajoutée au parent sans avoir son jeu de balises. Vous mettez-vous des points de vue dans la grille en plus de ces mises en page? Si tel est le cas, vous devrez le sauter si la balise est nulle (ou non un entier).


Ok, cette façon de ne pas se casser mais ne fonctionne toujours pas comme prévu. Si j'ajoute 3 vues, puis supprimez le premier et ajoutez-le à nouveau, il passe dans la première position au lieu d'aller à la dernière position, j'ai besoin de rafraîchir les positions après avoir retiré une vue.



1
votes

Je manipulerais une telle chose en utilisant Jsonarray

Chaque fois que vous ajoutez une vue, ajoutez ce texte dans la matrice JSON, puis rangez-la dans votre préférence partagée en tant que chaîne. P>

SharedPreferences sf = .....
String txt=sf.getString("YOUR_KEY","");
JsonArray myViewArray=new JsonArray(txt);
for(int i=0;i<myViewArray.length();i++){
   // ADD VIEW HERE
}


0 commentaires

2
votes

Tout d'abord, vous pouvez enregistrer les tags de vues "ou quoi que vous marchiez avec" dans une structure de données qui comporte une étiquette et la position que la vue est entrée, puis stocke le code dans SharedPreferences.

Arrays.sort(dataStructure , new Comparator<DataStructureElement>() {
    @Override
    public int compare(DataStructureElement o1, DataStructureElement o2) {
        return Integer.compare(o1.position, o2.position);
    }
});


0 commentaires