2012-08-13 2 views
2

Je reçois des données d'un serveur en utilisant JSON et je veux les classer par ordre alphabétique avec la section alphabet indexée et les stocker dans un ListView. Peut-être quelque chose qui va se passer dans:Index alphabétique ListView Sans un curseur

for(int i=0;i<jArray.length();i++){ 
// here 
} 

Je lis que vous pouvez commander des éléments tels que seulement à l'aide d'un curseur. Dans mon cas, il serait très inefficace de stocker les éléments du serveur dans la base de données et de les relire. Perte de temps et de mémoire. Donc, je vous demande s'il y a une solution à mon problème: ordre alphabétique avec la chaîne de section indexée par l'alphabet reçue de JSON.

EDIT: Je veux que mon listview ressemble à ceci http://eshyu.wordpress.com/2010/08/15/cursoradapter-with-alphabet-indexed-section-headers/. Je veux dire avec ces sections. Tous les tutoriels que j'ai trouvés ont dit que vous devez chercher des informations avec un curseur. Ma question était si je ne pouvais pas faire ceci sans un curseur, parce que ce serait une perte de mémoire de les stocker dans la base de données locale aussi.

+0

Salut, je crois que la meilleure façon de faire est d'obtenir les données triées du serveur lui-même. Les serveurs ont plus de puissance de calcul par rapport à un appareil de poche. Cela accélérera votre processus et vous évitera également d'utiliser des curseurs. – mudit

+0

Ce lien peut vous donner une idée..http: //stackoverflow.com/questions/7051785/when-jsonobject-keys-are-iterate-it-is-not-in-the-same-order-as-in- réponse-de –

+0

Oui, je sais commander. Ce que je ne sais pas, c'est comment implémenter la section indexée. C'est la chose qui fait que le parchemin fasse apparaître la première lettre de votre section. –

Répondre

1

Vous devrez peut-être analyser le tableau JSON:

List<Project> list = new ArrayList<Project>(); 

for (int i = 0; i < jArray.length(); i++) { 
    JSONObject obj = (JSONObject) jArray.get(i); 
    project = new Project(); 
    project.setId(Long.parseLong(obj.get("id").toString())); 
    project.setKey(obj.get("key").toString()); 
    project.setName(obj.get("name").toString()); 

    list.add(project); 
} 

Vous pouvez utiliser la classe de comparaison comme celui-ci pour les trier:

Collections.sort(list), new Comparator<Project>() { 
    public int compare(Project p1, Project p2) { 
     return p1.getKey().compareToIgnoreCase(p2.getKey()); 
    } 
}); 

vous pouvez également Project classe et implements comparable:

public class Project implements Comparable<Project> { 
    private long id; 
    private String key; 
    private String name; 

    public int compareTo(Project p) { 
    if (this.key > p.key) 
     return -1; 
    else if (this.key < p.key) 
     return 1; 
    return 0; 
    } 
} 

Et puis trier la liste par Collections.sort(list);

My suggestion est d'essayer de trier les données du côté serveur, parce que la mémoire du téléphone est limité et il peut vous prendre le temps d'application consommatrice pour afficher les données, mais vous ne pas avoir de problème de limitation de mémoire dans le côté serveur.

+1

Je peux trier les données sur le serveur mais je veux implémenter la section indexée alphabétique. Quand je défile pour faire apparaître la première lettre. C'est mon problème. –

+0

Ok, les as-tu classés du côté client comme les moyens que j'ai suggérés? – Ali

+0

Pas encore, je reçois l'information triée du serveur, donc je n'ai pas besoin de trier ici aussi. –

0

utiliser un comparateur pour trier l'arraylist comme décrit here. Et puis utilisez un ArrayAdapter pour afficher les éléments dans Listview