gpt4 book ai didi

android - 当使用 Web 服务使用可过滤获取数据时,自动完成 Textview 第二次显示旧数据

转载 作者:行者123 更新时间:2023-11-30 02:03:02 25 4
gpt4 key购买 nike

我在我的项目中集成了 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() 在 UI 线程上运行,如 onPostExecute().

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

关于android - 当使用 Web 服务使用可过滤获取数据时,自动完成 Textview 第二次显示旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31186082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com