2012-01-18 5 views
7

Desidero ordinare gli elementi di ListView in base al nome del prodotto. Ho un vettore chiamato "data" che è un tipo di classe.Ordinamento di ListView in base al nome del prodotto utilizzando l'adattatore personalizzato?

La classe che ho è:

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

e ho preso un adattatore personalizzato che si estende ArrayAdapter<RowData>.

Il mio codice di smistamento ho scritto in onCreate() è il seguente,

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

setListAdapter(adapter); 
adapter.notifyDataSetChanged(); 

devo usare un adattatore personalizzato a causa di mostrare prezzo del prodotto così come la quantità in mano del prodotto

il dato che è un vettore di tipo RowData che ottengo dopo il debug nell'ordine ordinato del nome del prodotto che desidero ma quando si associa allo ListView non viene visualizzato nell'ordine ordinato.

Sono nuovo ad Android, per favore aiutatemi.


Grazie Alex Lockwood, sto usando adattatore personalizzato di tipo ArrayAdaptor<Class>.

Nel mio metodo onCreate() Io sono l'attuazione metodo di ordinamento come il sotto,

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

Nella mia classe customAdaptor, devo ignorare sort come questo,

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

ti prego, aiutami se puoi modificare il codice sopra o suggerirmi il tuo codice.

Grazie in anticipo.

+0

Assicurarsi che il "CustomAdapter" sia in grado di visualizzare un array normale o ArrayList. Quando funziona, dovresti anche essere in grado di visualizzare un set di dati ordinato. –

+0

non è necessario utilizzare il metodo notifyDataSetChanged(), quando si imposta il nuovo adattatore da elencare. Basta incollare il codice dell'adattatore e il codice attività. – jeet

+0

Grazie Copa Potresti fornirmi il codice per lo stesso o per favore aiutami usando il codice –

risposta

18

Se si utilizza uno ArrayAdapter, è possibile chiamare sort sull'adattatore e passare uno Comparator. Come implementare il tuo Comparator dipende da te.


Edit I:

Non dovrebbe essere necessario eseguire l'override sort ... la classe ArrayAdapter implementa che per voi. Tutto ciò che devi fare è creare il tuo Comparator che ordinerà gli oggetti di tipo generico nel modo in cui desideri che vengano visualizzati. Inoltre, se si ordina l'elenco durante il runtime, potrebbe essere necessario notificare all'applicazione che il set di dati è stato modificato. Il tuo codice dovrebbe funzionare correttamente se usi questo approccio.

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

hanks Alex Lockwood si prega di vedere la mia domanda sottostante –

+0

grazie "Alex Lockwood", ora sta lavorando il problema che ho incontrato nel metodo getView() ci sono in grado di trovare il mio vettore che è stato ordinato prima ora che funziona grazie per il vostro aiuto! –

+0

vedere [questo] (http://stackoverflow.com/questions/39952230/sorting-custom-adapter-list-item-in-custom-listview) come ordinare listview per nome – Manish

4

Se si desidera ordinare le stringhe locali sensibili utilizzare il Collator Classe esempio in tedesco: 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); 
    } 
}); 
Problemi correlati