我将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就像AsyncTaskperformFiltering()运行在像doInBackground()这样的工作线程上,而publishResults()运行在像onPostExecute()这样的UI线程上。

因此,如果您有一种通过REST客户端获取数据的方法,该方法等待数据并且不使用回调,则应在performFiltering()中使用它。

10-07 19:14
查看更多