Android Auto complete Textview显示使用web服务使用filterable获取数据时较旧的数据恢复时间
我在我的项目中集成了AutoCompleteTextView,数据来自web服务,但事情发生了,当我第一次输入字符时,它显示正确的结果,但第二次显示的是第一次出现的旧数据,而不是新数据。 我的代码如下所示Android Auto complete Textview显示使用web服务使用filterable获取数据时较旧的数据恢复时间,android,web-services,autocompletetextview,android-filterable,Android,Web Services,Autocompletetextview,Android Filterable,我在我的项目中集成了AutoCompleteTextView,数据来自web服务,但事情发生了,当我第一次输入字符时,它显示正确的结果,但第二次显示的是第一次出现的旧数据,而不是新数据。 我的代码如下所示 private AutocompleteTextview act_search; List<SearchedItem> resultList = new ArrayList<>(); private SearchItemAdapter searchAdapter; p
private AutocompleteTextview act_search;
List<SearchedItem> resultList = new ArrayList<>();
private SearchItemAdapter searchAdapter;
private AutocompleteTextview act\u search;
List resultList=new ArrayList();
私有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);
}
});
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manager);
searchAdapter=新的SearchItemAdapter(这个,R.layout.row\u search\u项目);
act_search.setAdapter(搜索适配器);
act_search.setDropDownBackgroundResource(R.drawable.auto_bg);
act_search.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//TODO自动生成的方法存根
Log.d(标记“--在项目上单击位置”+位置);
}
});
}
适配器类
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;
}
}
公共类SearchItemAdapter扩展ArrayAdapter实现可过滤{
私有列表数据;
私有布尔错误=false;
公共SearchItemAdapter(上下文上下文,int textViewResourceId){
super(上下文,textViewResourceId);
mData=newarraylist();
}
@凌驾
public int getCount(){
返回mData.size();
}
@凌驾
公共字符串getItem(int索引){
返回mData.get(index.name);
}
@凌驾
公共过滤器getFilter(){
//TODO自动生成的方法存根
过滤器过滤器=新过滤器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults FilterResults=新的FilterResults();
if(约束!=null){
//检索自动完成结果。
mData=autocomplete(constraint.toString().trim());
//将数据分配给FilterResults
filterResults.values=mData;
filterResults.count=mData.size();
Log.d(“,”----内部过滤器----”;
}
返回过滤器结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
Log.d(“映射适配器”,“结果计数”+结果计数);
如果(错误){
//showtoos(getString(R.string.errServerNotResponding));
}否则{
if(results!=null&&results.count>0){
Log.d(“映射适配器”,“结果计数”+结果计数);
notifyDataSetChanged();
}否则{
notifyDataSetionValidated();
}
}
错误=错误;
}
};
回流过滤器;
}
私有列表自动完成(字符串输入){
试一试{
字符串userId=PrefSingleton.getInstance().getUserId();
RestClient.getApiClient().searchItem(ConstantCode.API_键,用户ID,输入,新回调(){
@凌驾
public void成功(ResponceSearch ResponceSearch,ResponceSearch){
int status=responceSearch.status;
Log.d(标记“状态--”+状态);
如果(状态==ConstantCode.status\u OK){
结果列表=responceSearch.data
}否则{
字符串errMessage=responceSearch.message;
showtoots(errMessage);
}
}
@凌驾
公共无效失败(错误){
}
});
}捕获(例外e){
Log.e(“映射适配器”,“无法处理JSON结果”,e);
错误=真;
}
返回结果列表;
}
}
任何帮助都是值得的,有人能想到这一点吗?请提供帮助。您的REST客户端正在异步运行,使用回调获取数据。问题在于
performFiltering()
已经异步运行。它期望在该方法结束时,您将提出FilterResults
可以这样想:Filter
类似于AsyncTask
performFiltering()
在工作线程上运行,如doInBackground()
和publishResults()
在UI线程上运行,如onPostExecute()
因此,如果您有一种通过REST客户机获取数据的方法,该客户机等待数据而不使用回调,那么您应该在performFiltering()
中使用该方法