Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Auto complete Textview显示使用web服务使用filterable获取数据时较旧的数据恢复时间_Android_Web Services_Autocompletetextview_Android Filterable - Fatal编程技术网

Android Auto complete Textview显示使用web服务使用filterable获取数据时较旧的数据恢复时间

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

我在我的项目中集成了AutoCompleteTextView,数据来自web服务,但事情发生了,当我第一次输入字符时,它显示正确的结果,但第二次显示的是第一次出现的旧数据,而不是新数据。 我的代码如下所示

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()
中使用该方法