2012-03-28 20 views
26

Tengo una vista de lista conectada a un adaptador de matriz personalizado. Esta lista muestra información recibida por una conexión TCP que cambia el conjunto de datos ...Sort listview with array adapter

soy capaz de ordenar la vista de lista con sort (Comparator<? super T> comparator), pero cuando se cambia el conjunto de datos, la vista de lista no es más ordenados ...

Puedo usar sort() cada vez que se cambia el dataSet, pero creo que esta no es la mejor opción ...

¿Cómo puedo hacer eso? ¿Alguna sugerencia?

EDITAR

estoy teniendo problemas en la aplicación de las soluciones presentadas ...

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; 
    } 

} 

de fragmentos de mi 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(); 
} 

En mi MyActivity.java

myDevAdapter.sort(SortType.ALPHA); 

Cuando estoy depuración, el método se llama super.sort(new MyComparatorB(sortType)); y el constructor de MyComparatorB se llama también. Pero el método compare(DeviceB lhs, DeviceB rhs) nunca se llama y mi arrayList no está ordenada ... ¿Qué estoy haciendo mal?

+0

por qué no utiliza ArrayList y ordena la matriz y restaura la lista de arreglos. – Behnam

+0

Creo que debería ordenar su matriz y llamar a adapter.notifyDataSetChanged() –

+0

@amp: ¿Qué es SortType aquí? – YuDroid

Respuesta

38

Creo que se necesita para anular notifyDataSetChanged método en su adaptador y realizar la clasificación correcta antes de llamar a su súper . Vea a continuación:

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

    super.notifyDataSetChanged(); 
} 

Si lo hace, ordenar la lista cada vez que llame notifyDataSetChanged método para actualizar elementos de la lista. De lo contrario, alimente una Lista/matriz ordenada a su adaptador.


o más preferiblemente, utilice el método sort disponible en el adaptador para hacer el trabajo.

adapter.sort(new Comparator<String>() { 
    @Override 
    public int compare(String lhs, String rhs) { 
     return lhs.compareTo(rhs); //or whatever your sorting algorithm 
    } 
}); 
+0

la única forma es llamar al método' super.sort (comparator) 'cada vez que se cambia el dataSet? – amp

+0

sí, agregue esto antes de llamar a super.notifyDataSetChanged, de modo que sus datos estén ordenados cada vez – waqaslam

+19

La función .sort llama automáticamente a notifyDataSetChanged, por lo que si utiliza este código con la ordenación incorporada, entrará en un ciclo infinito y se desbordará tu pila Haga esto solo si está administrando la lista usted mismo, pero la mayoría de las personas que usan un adaptador de matriz no lo hacen. – elBradford

0

Dado que el adaptador llena el ListView, la única forma es pasar el objeto de datos de una manera ordenada.

0

Una vez que se ordena la vista de lista, llame adapter.notifyDataSetChanged() de su actividad.

5
  • Almacenar los datos en un ArrayList
  • Adjuntar Array para adaptador de
  • Ordenar un array y asignan a sí
  • Uso notifyDataSetChanged() para actualizar el adaptador
3

Esto funciona para mí

@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); 
} 
0

Por el comentario de elBradford sobre la potencial para un desbordamiento de pila resultante del método notifyDataSetChanged(), terminé reemplazando el método add() de ArrayAdapter en su lugar para garantizar que los elementos mantengan una coherencia ordenada cuando se agregan uno por uno. (Al llamar a addAll() estoy ordenando los elementos antes, pero imagino que también podría reemplazar addAll()).

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

Basado en waqaslam y respuesta KristianR 's:

@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); 
} 

espero que ayude.