MultiAutoCompleteTextView с динамическими изменениями адаптера - PullRequest
8 голосов
/ 23 апреля 2011

У меня есть виджет MultiAutoCompleteTextView в моей Активности, который имеет ArrayAdapter<String>, который заполняется результатом веб-вызова. Когда пользователь вводит символы в текстовом представлении, список этого адаптера должен обновляться в фоновом режиме. Каков наилучший способ реализовать это?

Я уже пытался использовать AsyncTask для загрузки списка строк в фоновом режиме, но notifyDataSetChanged() вызывался из «неискажающего потока». Кроме того, это кажется немного окольным.

Другой вариант, с которым я столкнулся, заключается в том, что можно использовать Filterable, но я не встречал простых примеров ( AutoComplete4 кажется излишним) о том, как это сделать. Если примеров нет, может кто-нибудь дать общий обзор необходимых мне актеров - Фильтр, Фильтруемый и т. Д.

И разве это хороший путь?

Спасибо
Rajath

1 Ответ

0 голосов
/ 24 апреля 2016

Я знаю, что этот вопрос старый, но мне пришлось сделать то же самое, и я решил, что поделюсь с вами решением, иначе кому-то это понадобится.

Прежде всего, вам действительно нужно будет использовать AsyncTask для извлечения ваших данных. При этом я никогда не позволю AsyncTask каким-либо образом манипулировать моим классом представления. Вместо этого я бы предпочел использовать callback , передаваемый вместе с параметрами, которые вам нужны в 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();
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...