4

私はアンドロイド プロジェクトに取り組んでおり、SQLite データベースからデータを取得する ListView を使用しています。

ArrayList を使用してデータセットを作成し、この ArrayList を ArrayAdapter に追加しています。

データがデータベースから取得されているとき、SQLite に並べ替えを行うように指示しているので、ListView に追加されたときにすべてがアルファベット順に表示されます。特定の時点で、データベースからすべてを再度取​​得する必要なく、ListView に情報が動的に追加されます。ただし、すべてをアルファベット順に保ちたいと思います。

これを行うにはどうすればよいですか。DataSet を並べ替えてから、notifyDataSet の変更を呼び出しますか、または ArrayAdapter で直接並べ替えを行いますか。ArrayAdapter で並べ替えを実行することを検討しましたが、これは Comparator を使用する引数が必要ですが、これが何であるかわからず、達成したいことに役立つ可能性のある実用的な例が見つかりません。

以下は、配列にデータを入力し、リスト アダプターを設定するコードです。

ArrayList<Spanned> passwords = managePasswordList.getPasswordList();
        if (passwords != null && passwords.size() > 0)
        {
            passwordArrayAdapter = new ArrayAdapter<Spanned>(getActivity().getApplicationContext(), 
                    android.R.layout.simple_list_item_activated_1, passwords);
            setListAdapter(passwordArrayAdapter);
            myListView.setTextFilterEnabled(true);
            txtNoRecords.setVisibility(View.GONE);
        }
        else
        {
            txtNoRecords.setVisibility(View.VISIBLE);
        }

次に、データセットにデータを追加し、次を使用してリスト ビューを更新しています。

String company = Encryption.decrypt(passwords.get(i).company);
                    String username = Encryption.decrypt(passwords.get(i).username);
                    details = Html.fromHtml(company + "<br />" + "<small><font color=\"#767676\">" + username + "</b></small>");    

passwords.add(詳細);
passwordArrayAdapter.notifyDataSetChanged();

ご協力いただきありがとうございます。

UPDATE 1 Nick Bradbury が提案したことを試してみましたが、コンパレーターに問題があります。次のコードがありますが、ここからどこに行くべきかわかりません。

SQLiteDatabase myDb = null;
        Cursor cursor = null;
        ArrayList<Spanned> passwords = new ArrayList<Spanned>();
        try
        {
            myDb = context.openOrCreateDatabase("PasswordManager", Context.MODE_PRIVATE, null);
            cursor = myDb.rawQuery("SELECT * FROM password ASC", null);
            while (cursor.moveToNext())
            {
                final String company = Encryption.decrypt(cursor.getString(2));
                final String username = Encryption.decrypt(cursor.getString(4));
                Spanned details = Html.fromHtml(company + "<br />" + "<small><font color=\"#767676\">" + username + "</b></small>");
                passwords.add(details);

                Collections.sort(passwords, new Comparator<Spanned>() {

                    public int compare(Spanned lhs, Spanned rhs) {
                        return 0;
                    }
                });
            }
        }
        catch (SQLiteException ex)
        {
            common.showBasicAlertDialog("Unfortunately something has gone wrong.\n\nWe will fix this as soon as we can", false);
            Log.e("Database Error", ex.toString());
            return null;
        }

returnステートメントでは、何をすべきかわかりません。試してみましreturn lhs.compareToたが、lhs変数とrhs変数にはcompareTo関数がないため、何をすべきかわかりません。

4

1 に答える 1

9

これは、Comparatorを使用してArrayListをソートする簡単な例です。この例では、ArrayListは次のように定義されています。

public class StatusList extends ArrayList<Status>

このArrayListのソートルーチンは次のようになります。

public void sort() {
    Collections.sort(this, new Comparator<Status>() {                
        @Override
        public int compare(Status item1, Status item2) {
            return item2.getDate().compareTo(item1.getDate());
        }
    });
}

<Status>をArrayListに含まれるオブジェクトに置き換えてから、比較を変更して、並べ替えるオブジェクトの値を比較します。

于 2012-09-18T17:35:47.983 に答える