web-dev-qa-db-fra.com

Trier les vues de liste avec un adaptateur de matrice

J'ai une listview connectée à un adaptateur de baie personnalisé. Cette liste affiche les informations reçues par une connexion TCP qui modifie le dataSet ...

Je suis capable de trier la listview avec sort (Comparator<? super T> comparator), mais lorsque le dataSet est modifié, la listview n'est plus triée ... 

Je peux utiliser sort () chaque fois que le dataSet est modifié, mais je pense que ce n'est pas la meilleure option ...

Comment puis je faire ça? Aucune suggestion?

MODIFIER

J'ai des problèmes pour mettre en œuvre les solutions présentées ...

MyComparatorB.Java

public class MyComparatorB implements Comparator<DeviceB> {

private byte orderType;

public MyComparatorB(byte type) {

    this.orderType = type;

}

public int compare(DeviceB lhs, DeviceB rhs) {

    int res = 0;
    if (orderType == SortType.ALPHA) {
            res = (lhs.getName()).compareTo(rhs.getName());
        }
        else if (orderType == SortType.LAST_ACT) {
            res = (rhs.getTime().getTime()).compareTo(lhs.getTime().getTime());
        }
        return res;
    }

}

Extrait de my customArrayAdapter.Java

    @Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}


//-----------Order the content of the arrayAdapter------------//
public void sort(byte sortType) {

    super.sort(new MyComparatorB(sortType));
    notifyDataSetChanged();
}

Dans mon MyActivity.Java

myDevAdapter.sort(SortType.ALPHA);

Lorsque je débogue, la méthode super.sort(new MyComparatorB(sortType)); est appelée et le constructeur de MyComparatorB est également appelé. Mais la méthode compare(DeviceB lhs, DeviceB rhs) n’est jamais appelée et mon tableauListe n’est pas trié ........ Qu'est-ce que je fais mal?

27
amp

Je suppose que vous devez remplacer la méthode notifyDataSetChanged dans votre adaptateur et effectuer le tri juste avant d'appeler son super Voir ci-dessous:

@Override
public void notifyDataSetChanged() {
    //do your sorting here

    super.notifyDataSetChanged();
}

Cela triera la liste à chaque fois que vous appelez la méthode notifyDataSetChanged pour actualiser les éléments de la liste. Sinon, envoyez une liste/un tableau trié à votre adaptateur.


Ou plus préférablement, utilisez la méthode sort disponible dans votre adaptateur pour faire le travail.

adapter.sort(new Comparator<String>() {
    @Override
    public int compare(String lhs, String rhs) {
        return lhs.compareTo(rhs);   //or whatever your sorting algorithm
    }
});
41
waqaslam
  • Stocker des données dans une liste de tableaux
  • Attacher un tableau à l'adaptateur
  • Trier et assigner à un tableau
  • Utilisez notifyDataSetChanged () pour actualiser l'adaptateur
4
Behnam

Ça marche pour moi

@Override
public void notifyDataSetChanged() {
    this.setNotifyOnChange(false);

    this.sort(new Comparator<String>() {
        @Override
        public int compare(String lhs, String rhs) {
            return lhs.compareTo(rhs);
        }
    });

    this.setNotifyOnChange(true);
}
3
KristianR

Selon le commentaire de elBradford concernant le risque de débordement de pile résultant de l'approche notifyDataSetChanged (), j'ai fini par remplacer la méthode add () de ArrayAdapter afin de garantir que les éléments conservent une cohérence triée lorsqu'ils sont ajoutés un par un. (lors de l'appel de addAll (), je trie les éléments avant; mais j'imagine que vous pouvez également remplacer addAll ()).

    @Override
    public void add(ListThing object) {
        super.add(object);
        this.sort(ListThing.sComparator);
    }
1
HelloImKevo

Étant donné que l’adaptateur remplit le ListView, le seul moyen consiste à transmettre l’objet de données de manière triée.

0
Blackbelt

Une fois que la liste est triée, appelez adapter.notifyDataSetChanged () à partir de votre activité.

0
user936414

Basé sur les réponses de waqaslam et KristianR :

@Override
public void notifyDataSetChanged() {
    this.setNotifyOnChange(false);

    this.sort(new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            return s1.compareTo(s2);
        }
    });

    super.notifyDataSetChanged();
    this.setNotifyOnChange(true);
}

J'espère que ça aide.

0
David Chea