8

アクティビティにMultiAutoCompleteTextViewウィジェットがありArrayAdapter<String>、Web ベースの呼び出しの結果が取り込まれます。ユーザーがテキストビューに文字を入力すると、このアダプターのリストがバックグラウンドで更新されます。これを実装する最良の方法は何ですか?

AsyncTaskバックグラウンドで文字列リストをダウンロードするためにすでに使用しようとしましたnotifyDataSetChanged()が、「非発信スレッド」から呼び出されていました。さらに、これは少し回りくどいようです。

私が遭遇した他のオプションはFilterable使用できるということですが、これを行う方法についての簡単な例 ( AutoComplete4 はやり過ぎのようです) には遭遇していません。例がない場合は、誰かが必要なアクターの概要を説明できますか? Filter、Filterable など。

また、これは良い方法ですか?

ありがとう、
ラジャス

4

1 に答える 1

0

この質問が古いことは知っていますが、同じことをしなければならなかったので、解決策をあなたと共有するか、誰かがそれを必要とするだろうと考えました.

まず第一に、実際に を使用しAsyncTaskてデータを取得する必要があります。そうは言っても、AsyncTask が私のビュー クラスを操作することは決してありません。代わりに、AsyncTask で必要なパラメーターと共に渡されるコールバックを使用したいと思います。AsyncTask が終了するとすぐに、 の呼び出しを担当するコールバック メソッドを呼び出しますnotifyDataSetChanged()

ここにいくつかのコードがあります:

MyAsyncTask.java

public class MyAsyncTask extends AsyncTask<Object, Void, Object> {

@Override
protected String doInBackground(Object... params) {
    MyController callbackClass = (MyController) params[0];

    // Get your other parameters and do your stuff here...

    // Call the setter with the data you get back and refresh the view
    // either here or implementing onPostExecute.
    callbackClass.setMyData(myData);
    callbackClass.refreshView();

    // Return any object if you need.
    return null;
 }
}

MyCallbackClass.java

 public MyCallbackClass extends Fragment{

   private List<MyDataType> myData;

   private ArrayAdapter<MyDataType> myAdapter;

   // Your methods including setters and getters.

    public void refreshFriendList(){
     if(myAdapter == null){
      initAutoCompleteView();
     }
     myAdapter.clear();
     myAdapter.addAll(myData);
     myAdapter.notifyDataSetChanged();
   }

}
于 2016-04-23T21:38:36.820 に答える