#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();
}
}