2013-10-30 11 views
15

私は単純なarrayadapterリストビューをソートしようとしています。ここで私が試したものです:アルファベット順のソートリストビュー

ListView lv; 
String[] months = { 
     "January", 
     "February", 
     "March", 
     "April", 
     "May", 
     "June", 
     "July", 
     "August", 
     "September", 
     "October", 
     "November", 
     "December" 
}; 

ArrayAdapter<String> adapter; 
ArrayList<String> list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    lv = (ListView)findViewById (R.id.listView1); 
    lv.setFastScrollEnabled(true); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, months); 
    lv.setAdapter(adapter); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 

    switch (item.getItemId()) { 
    case R.id.sortasc: 
     list = new ArrayList<String>(Arrays.asList(months)); 
     Collections.sort(list); 
     for(int i=0; i < list.size(); i++){ 
      System.out.println(list.get(i)); 
     } 
     adapter.clear(); 
     adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, list); 
     adapter.notifyDataSetChanged(); 
     return true; 
    case R.id.sortdesc: 

     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

しかし、私はUnsupportedOperationExceptionを取得しています、これで間違って何ですか?私は本当に助けが必要です。前もって感謝します!

答えて

18

アイテムをソートした後、setAdapter(アダプタ)を呼び出していませんでした。

リストをソートするには代わりに

adapter.clear(); // Useless 
adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, list); 
adapter.notifyDataSetChanged(); 
+0

これは私に役立ちます、私の悪い私はsetAdapterメソッドを呼び出すことを忘れました – Dunkey

+1

私はあなたが再作成する必要はないと思うと毎回...ソース(月配列)を更新し、adapter.notifyDatasetChanged(); –

+0

@ umair.aliアダプターのインスタンスを変更する場合、常に 'setAdapter'を呼び出す必要があります。あなたは最初にあなたの側で確認する必要があります... –

2
  1. アレイを並べ替えます。
  2. アダプタを再作成してください。
  3. アダプタをlistviewに適用します。
+0

の宣言の下にこのコードをコピー&ペーストすることができ、別のアダプターを持っている場合。それでも同じ例外が発生しています。 – Dunkey

+0

あなたのlogcatを投稿してください –

+0

私は今、私のbaseadapterを拡張しようとしています、それにいくつかの標準的なソート方法を与えて、それ自体に通知させてください。これはうまくいくはずですが、これはうまくいくはずです。 –

1

adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, list); 
lv.setAdapter(adapter); 
adapter.notifyDataSetChanged(); 

以下のように使用し、あなたはComparatorを使用する必要があります。アルファベット順ソートを行うコンパレータを使用して、基礎となるコレクションをソートしてから、リストを更新して更新する必要があります。

ここArrayAdapterを使ってこれを行うの一例です。ここでhttps://stackoverflow.com/a/8920348/1369222

13

がトリックです...

private void sortAscending() { 
    List<String> sortedMonthsList = Arrays.asList(months); 
    Collections.sort(sortedMonthsList); 

    months = (String[]) sortedMonthsList.toArray(); 
} 

そしてsortAscendingのために、同様に

sortAscending(); 
adapter.notifyDatasetChanged(); 

を呼び出して、あなたが実装することができますカスタムComparator降順ソート...

ほしいと思っています。:)

+1

ありがとう!これも同様に役立ちます。 – Dunkey

8
Comparator<String> ALPHABETICAL_ORDER1 = new Comparator<String>() { 
    public int compare(String object1, String object2) { 
     int res = String.CASE_INSENSITIVE_ORDER.compare(object1.toString(), object2.toString()); 
     return res; 
    } 
}; 

Collections.sort(your array name, ALPHABETICAL_ORDER1); 
3

アルファベット順のソートリストビューです。

listAdapter = new AppsAdapter(MainActivity.this,R.layout.content_layout,appList); 
     final Collator col = Collator.getInstance(); 
     listAdapter.sort(new Comparator<ApplicationInfo>() { 
      @Override 
      public int compare(ApplicationInfo lhs, ApplicationInfo rhs) { 
       return col.compare(lhs.loadLabel(packageManager),rhs.loadLabel(packageManager)); 
      } 
     }); 
+0

「packgeManager」はどうですか? –

0

その簡単なあなたはすでにあなたはちょうど私が私のコードを更新しましたが、それでも無駄にしましアダプタ

adapter.sort(new Comparator<String>() { 
     @Override 
     public int compare(String arg1, String arg0) { 
      return arg1.compareTo(arg0); 
     } 
    }); 
関連する問題