2012-01-18 9 views
7

ListViewのアイテムを製品名で並べ替える必要があります。私はクラスの一種である "データ"と呼ばれるベクトルを持っています。カスタムアダプタを使用している製品の名前によるListViewのソート?

私が持っているクラスは、次のとおりです。

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

と私はArrayAdapter<RowData>を拡張するカスタムアダプタをとっています。

私は次の通りである onCreate()に書かれている

マイソートコード、製品の手で製品の価格だけでなく、数量を表示するので、私は、カスタムアダプタを使用する必要が

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

setListAdapter(adapter); 
adapter.notifyDataSetChanged(); 

RowDataのベクトルであるデータ私は欲しい製品名のソート順でデバッグしていますが、ListViewにバインドするとソート順で表示されません。

私はアンドロイドに新しいです。私を助けてください。


ありがとうAlex Lockwood、私はArrayAdaptor<Class>タイプのカスタムアダプタを使用しています。私は、以下のように私のcustomAdaptorクラスで

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

をソートする方法を実現しています私のonCreate()方法で

、私はこのようなsortをオーバーライドする必要ができれば、

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

は私を助けてください上記のコードを変更するか、自分のコードを教えてください。

ありがとうございます。

+0

"CustomAdapter"が通常の配列またはArrayListを表示できることを確認してください。これがうまくいくと、ソートされたデータセットを表示することもできます。 –

+0

新しいアダプタをリストに設定するときに、notifyDataSetChanged()メソッドを使用する必要はありません。 アダプタコードとアクティビティコードを貼り付けてください。 – jeet

+0

ありがとうございます。コードを私に提供してください。同じコードを使用してください。 –

答えて

18

ArrayAdapterを使用している場合は、sortに電話してComparatorを渡すことができます。 Comparatorの実装方法はあなた次第です。


編集I:

あなたはsortを上書きする必要はありません... ArrayAdapterクラスはあなたのためにすることを実現しています。あなたがする必要があるのは、汎用タイプのオブジェクトを表示する方法で並べ替える独自のComparatorを作成することだけです。また、実行時にリストをソートする場合、データセットが変更されたことをアプリケーションに通知する必要があります。この方法を使用すると、コードが正しく動作するはずです。

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

ハンクスAlex Lockwood –

+0

「Alex Lockwood」に感謝しています。現在、getView()メソッドで発生している問題を解決しています。私のVectorは以前にソートされています。 –

+0

plz参照[this](http://stackoverflow.com/questions/39952230/sorting-custom-adapter-list-item-in-custom-listview)listviewを名前で並べ替える方法 – Manish

4

あなたは、ロケールに依存する文字列をソートしたい場合は、Collatorクラスなどを使用しますドイツ語: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); 
    } 
}); 
関連する問題