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?
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
}
});
Ç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);
}
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);
}
Étant donné que l’adaptateur remplit le ListView, le seul moyen consiste à transmettre l’objet de données de manière triée.
Une fois que la liste est triée, appelez adapter.notifyDataSetChanged () à partir de votre activité.
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.