MultiAutoCompleteTextView с динамическими изменениями адаптера

#android #backgroundworker #autocompletetextview

#Android #backgroundworker #autocompletetextview

Вопрос:

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

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

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

Также это хороший способ пойти?

Спасибо,
Раджат

Комментарии:

1. Есть ли у вас какое-либо решение

2. @user1767260, прошло более двух лет с тех пор, как я опубликовал эти вопросы; я не думаю, что я преследовал это.

Ответ №1:

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

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

}