2017-05-04 31 views
1

私のアプリでは、私の目標はユーザーがギャラリーから画像をアップロードしてデータベースに保存することです。各画像は名前を持ち、名前と画像はリストビューに表示されます。リストビューは、電話のような連絡先の並べ替えのような種類になります。彼らが提供しているのは、異なるホテルやリゾート、さらには学校などの物件のマップです。私はすべてのことが私が望むように働いていますが、何らかの理由で私はアルファベット順にそれらを得ることができません。私は他の例とスニペットを試しましたが、運がありません。次のように私はそれを持っているコードは次のとおりです。ListView要素をアダプタを使用して昇順にソート

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.display_hotels); 

    db = new DatabaseHandler(this); 

    lv = (ListView) findViewById(R.id.list1); 
    pic = (ImageView) findViewById(R.id.pic); 
    fname = (EditText) findViewById(R.id.txt1); 

    final ArrayList<Hotel> hotels = new ArrayList<>(db.getAllHotels()); 
    data = new dataAdapter(this, hotels); 

    Collections.sort(hotels, new Comparator<Hotel>() 
    { 
     public int compare(Hotel a1, Hotel a2) 
     { 
      return (a1.toString()).compareTo(a2.toString()); 
     } 
    }); 

    lv.setAdapter(data); 
} 

私は比較のためにコードを配置する前に:

Collections.sort(hotels, new Comparator<Hotel>() 
    { 
     public int compare(Hotel a1, Hotel a2) 
     { 
      return (a1.toString()).compareTo(a2.toString()); 
     } 
    }); 

それは単に彼らが保存された順に画像を表示していました。しかし、このコードでは何かが間違っているようです。 Westgate Resort、Grand Country Inn、College of the Ozarksの順番で3つの異なる画像を保存しようとしました。何らかの理由でWestgateが最初に、College of the Ozarksが2位、Grand Country Innが3位に表彰されました。同じ画像を追加してGrand Country Innの名前を付けても、Westgate Resortはリストの一番下に落ちます。それは正しいようですが、別のイメージを追加すると、Westgateは先頭に戻ります。どんな助けでも大歓迎です!あなたの時間をありがとう。

+2

ホテルオブジェクトの.toString()を比較しようとしています。代わりにホテルのオブジェクトに属性を持たせて、imagestringと言ってそのことを正しく比較できるようにする必要があります。このように、この文字列を与えるtostring関数をオーバーライドしなかった場合は、直接文字列にキャストするときに問題が発生するのが普通です – koksalb

答えて

0

私はそれを把握することができました。 Collections.sort()メソッドを使用する代わりに、アダプタでsort()を使用しました。

data = new dataAdapter(this, hotels); 

    data.sort(new Comparator<Hotel>() 
    { 
     @Override 
     public int compare(Hotel arg0, Hotel arg1) 
     { 
      return arg0.getFName().compareTo(arg1.getFName()); 
     } 
    }); 

    data.notifyDataSetChanged(); 
    lv.setAdapter(data); 

私はそれが悪い習慣であるかどうかは分かりませんが、私が欲しいものについては、それは完璧に働きます。

0

メソッドを呼び出すと、アダプタが初期化されます。

0

data.notifyDataSetChanged() 

あなたがリストに要素を追加するたびに追加することを検討してください。

もう1つのことは、リストに追加する前に各要素を小文字にすることです。またはこのコードを試してください

Collections.sort(hotels, new Comparator<Hotel>(){ 
    public int compare(Hotel a1, Hotel a2) 
    { 
     return (a1.toString().toLowerCase()).compareTo(a2.toString().toLowerCase()); 
    } 
}); 
+0

Hmm。私はこの解決策を試みたが、残念なことに運がなかった。表示ボタンをクリックするたびに、出力が異なります。各要素は毎回リストの上に移動するように見え、毎回異なる出力になります。 –

+0

あなたはdata = new dataAdapter(this、hotels);を呼び出す前にソートを試みましたか? – berrytchaks

+0

これは、ボタンをクリックして結果を表示すると、アプリがクラッシュする原因になります。しかし、残念なことに、logcatにエラーはありません。 –

関連する問題