我将AutoCompleteTextView集成到我的项目中,该数据来自Web服务,但是事情发生了,当我第一次输入字符时,它显示正确的结果,但是第二次,它显示的是旧数据,它是第一时间的,而不是新数据。
我的代码如下。
private AutocompleteTextview act_search;
List<SearchedItem> resultList = new ArrayList<>();
private SearchItemAdapter searchAdapter;
在Oncreate方法中初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manager);
searchAdapter = new SearchItemAdapter(this, R.layout.row_search_item);
act_search.setAdapter(searchAdapter);
act_search.setDropDownBackgroundResource(R.drawable.auto_bg);
act_search.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
Log.d(TAG, "-- on item click position " + position);
}
});
}
转接器类别
public class SearchItemAdapter extends ArrayAdapter<String> implements Filterable {
private List<SearchedItem> mData;
private boolean error = false;
public SearchItemAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
mData = new ArrayList<SearchedItem>();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public String getItem(int index) {
return mData.get(index).name;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
// Retrieve the autocomplete results.
mData = autocomplete(constraint.toString().trim());
// Assign the data to the FilterResults
filterResults.values = mData;
filterResults.count = mData.size();
Log.d("", "----- inside filter ---- ");
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
Log.d("Map adapter ", " -- result count " + results.count);
if (error) {
// showToast(getString(R.string.errServerNotResponding));
} else {
if (results != null && results.count > 0) {
Log.d("Map adapter ", " -- result count " + results.count);
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
error = false;
}
};
return filter;
}
private List<SearchedItem> autocomplete(String input) {
try {
String userId = PrefSingleton.getInstance().getUserId();
RestClient.getApiClient().searchItem(ConstantsCode.API_KEY, userId, input, new Callback<ResponceSearch>() {
@Override
public void success(ResponceSearch responceSearch, Response response) {
int status = responceSearch.status;
Log.d(TAG, "status -- " + status);
if (status == ConstantsCode.STATUS_OK) {
resultList = responceSearch.data
} else {
String errMessage = responceSearch.message;
showToast(errMessage);
}
}
@Override
public void failure(RetrofitError error) {
}
});
} catch (Exception e) {
Log.e("Map adapter ", "Cannot process JSON results", e);
error = true;
}
return resultList;
}
}
任何帮助都是可观的,任何人对此都有想法吗?请帮忙。
最佳答案
您的REST客户端正在异步运行,使用回调获取数据。问题是performFiltering()
已经异步运行。期望您在该方法结束时提出FilterResults
。
这样想:Filter
就像AsyncTask
。 performFiltering()
运行在像doInBackground()
这样的工作线程上,而publishResults()
运行在像onPostExecute()
这样的UI线程上。
因此,如果您有一种通过REST客户端获取数据的方法,该方法等待数据并且不使用回调,则应在performFiltering()
中使用它。