40

RESTful Web サービスからリストを取得して、AutoCompleteTextview によって提供される提案を定期的に変更したいのですが、スムーズに動作させることができません。ハードコーディングされた提案のリストを設定して、それが機能していることを確認します。

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, new String[] {"Hi", "Ho"});
speciesName.setAdapter(adapter);//my autocomplete tv

私はテキストビューに TextWatcher を持っていて、テキストが変更されたときにノンブロッキング呼び出しを起動して提案の新しいリストを取得します - 新しいリストを取得するこの部分は正常に機能しています。次に、次のようにアダプターをリセットします。

public void setOptionsAndUpdate(String[] options) {
    Log.d(TAG, "setting options");
    //speciesName.setAdapter((ArrayAdapter<String>)null);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, options);
    speciesName.setAdapter(adapter);
}

このメソッドは呼び出されますが、機能しません。 を呼び出しても、提案のリストが消えるか、表示された提案が変更されないままsetAdapterです。

これは正しいアプローチですか?SimpleCursorAdapterWeb サービスをコンテンツ プロバイダーとして登録する方法を調べましたが、わかりませんでした。(これはhttp://www.blah.com/query?term=XXの形式で、XX はアプリからの入力であり、応答は文字列の JSON 配列です。)

4

5 に答える 5

57

アダプターでデータを動的に追加および変更するときに、 adapter.notifyDataSetChanged() を使用してもうまくいきませんでした。私の状況では、非同期で外部 API をヒットし、完了データのリストを定期的に取得していました。

このコードはアダプターをクリアし、期待どおりに新しいデータを追加します。ただし、データを強制的に表示するには、getFilter().Filter メソッドを呼び出す必要がありました。また、API 呼び出しが非同期だったため、AutocompleteTextView の現在のテキストに基づいて明示的にフィルター処理する必要がありました。

adapter.clear();
for (Map<String, String> map : completions) {
     adapter.add(map.get("name"));
}

//Force the adapter to filter itself, necessary to show new data.
//Filter based on the current text because api call is asynchronous. 
adapter.getFilter().filter(autocompleteTextView.getText(), null);
于 2013-10-29T19:32:58.607 に答える
24

AutoCompleteTextViewを更新する方法は次のとおりです。

String[] data = terms.toArray(new String[terms.size()]);  // terms is a List<String>
ArrayAdapter<?> adapter = new ArrayAdapter<Object>(activity, android.R.layout.simple_dropdown_item_1line, data);
keywordField.setAdapter(adapter);  // keywordField is a AutoCompleteTextView
if(terms.size() < 40) keywordField.setThreshold(1); 
else keywordField.setThreshold(2);

もちろん、これは静的であり、無線による提案には対応していませんが、AutoCompleteTextViewに割り当てた後、変更についてアダプターに通知することをお勧めします。

adapter.notifyDataSetChanged();   

お役に立てれば。

-セルカン

于 2011-11-15T20:49:52.780 に答える
2

アダプターを更新するために私が見つけた最良の解決策:

Editable text = autocomplete.getText();
autocomplete.setText(text);
autocomplete.setSelection(text.length());

使い方:

autoCompleteTextViewのテキストを現在のテキストで設定するため、アダプタはデータが変更されたことを通知し、listViews のコンテンツを更新します。

しかし、このトリックによって、カーソルは edittext の先頭に移動します。autocomplete.setSelection(text.length())そのため、カーソルを最後に移動するために使用します。

魔法のように動作します!

編集:

また、 の代わりにclear()add()およびremove()メソッドを直接使用する必要があります。ArrayAdapterArrayList

于 2018-08-12T11:41:05.643 に答える