6

複数のエントリを入力して、オートコンプリートの提案を表示できる MultiAutoCompleteTextView があります。データを送信すると問題が発生します。入力した文字列をドロップダウン リストに追加していますが、データを並べ替えようとすると失敗します。送信時に実行されるコード:

final private Comparator<String> comp = new Comparator<String>() {
    public int compare(String e1, String e2) {
        return e1.toString().compareTo(e2.toString());
    }
};

((ArrayAdapter<String>) autoCompleteView.getAdapter()).add(getString());                    
((ArrayAdapter<String>) autoCompleteView.getAdapter()).sort(comp);  

autoCompleteView をクリックすると何が起こるかのコード:

        view.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                adapter.getFilter().filter(null);
                //adapter.sort(comp);
                view.showDropDown();
            }
        });

私がやっていることに誰かが何か問題を見つけることができますか?

編集: @Sam からの変更を組み込んだ後の詳細情報

private ArrayList<String> array = new ArrayList<String>();
private ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,
        array);

private void setUpAutoComplete(final MultiAutoCompleteTextView view)
{
    array.add("test string");   // this is successfully added to the drop down list
    Collections.sort(array, comp);
    adapter.notifyDataSetChanged();
}

private void onSubmit()
{
    array.add(getString()); // this fails to add
    adapter.notifyDataSetChanged();
}
4

1 に答える 1

11

しかし、データを並べ替えようとすると失敗します

これは少し曖昧です。しかし、私は推測します。

まず、冗長なことを行います。

return e1.toString().compareTo(e2.toString());

e1とはすでに文字列であるため、e2を呼び出す必要はありませんString#toString()。また、この基本的な文字列コンパレータはすでに存在します。したがって、これは必要ありません。

より良いテクニックは、アダプターではなくリストをソートすることです。コレクションの並べ替え方法を使用するだけです。

List<String> list = new ArrayList<String>();
list.add(getString());
...

Collections.sort(list);
adapter.notifyDataSetChanged();

に変更adapter.add()したことに注意してくださいlist.add()。これを行ったのは、adapter.add()呼び出しlist.add() 、新しいリストがソートadapter.notifyDataSetChanged()れるまでアダプターを更新しないためです。

于 2012-07-16T20:30:29.903 に答える