2012-01-18 15 views
7

Quiero ordenar elementos de ListView por nombre de producto. Tengo un vector llamado "datos" que es un tipo de clase.Clasificación de ListView por nombre del producto con adaptador personalizado?

La clase que tengo es:

public static class RowData implements Comparable<RowData>{ 
    public String mProductName; 
    protected int mId; 

    protected int mOnHand; 
    protected double mPrice; 
    protected boolean mIsColleaction; 
    protected boolean mIsPrePack; 

    RowData(int id ,String productName,int onhand,double price,boolean IsColleaction, boolean IsPrePack) { 
     mId= id; 
     mProductName= productName; 
     mOnHand =onhand; 
     mPrice = price; 
     mIsColleaction =IsColleaction; 
     mIsPrePack = IsPrePack; 
    } 

    @Override 
    public String toString() { 
     return mProductName; 
    } 

    public int compareTo(RowData other) { 
     return mProductName.compareTo(other.mProductName); 
    } 

    public static Comparator<RowData> COMPARE_BY_PRODUCTNAME = new Comparator<RowData>() { 
     public int compare(RowData one, RowData other) { 
      return one.mProductName.compareTo(other.mProductName); 
     } 
    }; 
} 

y he tomado un adaptador personalizado que se extiende ArrayAdapter<RowData>.

Mi código de clasificación que he escrito en onCreate() es el siguiente,

Collections.sort(data, RowData.COMPARE_BY_PRODUCTNAME); 
adapter = new CustomAdapter(this, R.layout.list,R.id.title, data); 

setListAdapter(adapter); 
adapter.notifyDataSetChanged(); 

Tengo que usar un adaptador personalizado debido a la demostración del precio del producto, así como la cantidad en la mano del producto

los datos que es un vector de tipo RowData que estoy recibiendo después de la depuración en orden ordenado del nombre del producto que quiero, pero cuando se unen a la ListView no se muestra en orden ordenado.

Soy nuevo en android, por favor ayúdame.


Gracias Alex Lockwood, estoy usando adaptador personalizado de tipo ArrayAdaptor<Class>.

En mi método onCreate() Me estoy poniendo en práctica método de clasificación como el siguiente,

adapter = new CustomAdapter(this, R.layout.list,R.id.title, data); 

adapter.sort(new Comparator<RowData>() { 
    public int compare(RowData arg0, RowData arg1) { 
     return arg0.mProductName.compareTo(arg1.mProductName); 
    } 
}); 

setListAdapter(adapter); 

En mi clase customAdaptor, tengo que anular sort como este,

public void sort(Comparator<? super RowData> comparator) { 
    // TODO Auto-generated method stub 
    super.sort(comparator); 
} 

Por favor, ayúdame si puedes modifique el código anterior o sugiérame su código.

Gracias de antemano.

+0

Asegúrese de que su "CustomAdapter" pueda mostrar una matriz normal o ArrayList. Cuando esto funcione, también debería poder mostrar un conjunto de datos ordenados. –

+0

no necesita utilizar el método notifyDataSetChanged(), cuando está configurando un nuevo adaptador para la lista. Simplemente pegue el código del adaptador y el código de actividad. – jeet

+0

Gracias Copa ¿Podría proporcionarme el código para el mismo o podría ayudarme a usar el código –

Respuesta

18

Si está utilizando un ArrayAdapter, puede llamar al sort en el adaptador y pasar un Comparator. La forma en que implemente su Comparator depende de usted.


Editar I:

No debería ser necesario para anular sort ... la clase implementa ArrayAdapter que para usted. Todo lo que tiene que hacer es crear su propio Comparator que clasifique los objetos de tipo genérico de la manera que desee que aparezcan. Además, si ordena la lista durante el tiempo de ejecución, es posible que deba notificar a la aplicación que el conjunto de datos ha cambiado. Su código debería funcionar correctamente si usa este enfoque.

adapter = new CustomAdapter(this, R.layout.list,R.id.title, data); 

adapter.sort(new Comparator<RowData>() { 
    public int compare(RowData arg0, RowData arg1) { 
     return arg0.mProductName.compareTo(arg1.mProductName); 
    } 
}); 

setListAdapter(adapter); 
adapter.notifyDataSetChanged(); 
+0

madejas Alex Lockwood por favor vea mi consulta siguiente –

+0

gracias "Alex Lockwood", ahora está trabajando el problema que tengo encuentro en el método getView() allí puedo encontrar mi Vector que está ordenado anteriormente, ¡eso está funcionando gracias por su ayuda! –

+0

por favor vea [this] (http://stackoverflow.com/questions/39952230/sorting-custom-adapter-list-item-in-custom-listview) cómo ordenar la lista por nombre – Manish

4

Si desea ordenar cadenas sensibles al entorno local utiliza la clase Collator por ejemplo, en alemán: A, Ä, B

final Collator col = Collator.getInstance(); 
adapter.sort(new Comparator<RowData>() { 
    public int compare(RowData arg0, RowData arg1) { 
     return col.compare(arg0.mProductName, arg1.mProductName); 
    } 
}); 
Cuestiones relacionadas