2012-01-18 3 views
7

Chcę posortować elementy listy według nazwy produktu. Mam wektor o nazwie "dane", który jest typem klasy.Sortowanie listView według nazwy produktu za pomocą niestandardowego adaptera?

Klasa mam to:

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

i brałem kartę niestandardową, która rozciąga ArrayAdapter<RowData>.

Mój kod sortowania Pisałem w onCreate() jest następująca,

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

setListAdapter(adapter); 
adapter.notifyDataSetChanged(); 

muszę używać adaptera niestandardowego dlatego, aby pokazać cenę produktu, jak również ilość w ręku produktu

dane, które są wektorem typu RowData Dostaję się po debugowaniu w posortowanej kolejności produktu Nazwa, której chcę, ale po związaniu z ListView nie jest wyświetlana w posortowanej kolejności.

Jestem nowy na Androida, pomóż mi.


Dzięki Alex Lockwood, używam niestandardowego adaptera typu ArrayAdaptor<Class>.

W mojej metody onCreate() Ja realizacji sortowania sposób jak poniżej,

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

W moim customAdaptor klasie, muszę zastąpić sort takiego,

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

jeśli możesz mi pomóc zmodyfikuj powyższy kod lub zasugeruj mi swój kod.

Z góry dziękuję.

+0

Upewnij się, że Twój "CustomAdapter" jest w stanie wyświetlić normalną tablicę lub ArrayList. Gdy to zadziała - powinieneś również mieć możliwość wyświetlenia posortowanego zestawu danych. –

+0

Nie musisz używać metody notifyDataSetChanged(), gdy ustawiasz nową kartę do listy. Wystarczy wkleić kod adaptera i kod aktywności. – jeet

+0

Dzięki Copa Czy mógłbyś podać mi kod dla tego samego, czy mógłbyś mi pomóc, używając kodu –

Odpowiedz

18

Jeśli używasz ArrayAdapter, możesz zadzwonić pod numer sort na przejściówkę i przekazać Comparator. Sposób wdrożenia Comparator należy do Ciebie.


Edycja I:

Nie należy trzeba zastąpić sort ... klasa ArrayAdapter realizuje to za Ciebie. Wszystko, co musisz zrobić, to stworzyć własny obiekt Comparator, który posortuje obiekty typu ogólnego w taki sposób, w jaki chcesz je wyświetlać. Ponadto, jeśli sortujesz listę podczas wykonywania, może być konieczne powiadomienie aplikacji o zmianie zestawu danych. Twój kod powinien działać poprawnie, jeśli używasz tego podejścia.

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 zobacz moje zapytanie poniżej –

+0

dziękuję "Alex Lockwood", teraz działa problem, w którym mam spotkać w metodzie getView() tam jestem w stanie znaleźć mój wektor, który jest posortowany wcześniej, dziękuję za pomoc! –

+0

plz zobacz [to] (http://stackoverflow.com/questions/39952230/sorting-custom-adapter-list-item-in-custom-listview) jak sortować listę według nazwiska – Manish

4

Jeśli chcesz uporządkować locale wrażliwe struny użyć Collator np Class w języku niemieckim: 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); 
    } 
});