我在实现searchview时遇到问题,显示来自服务器的数据的结果。我目前使用AsyncTask,因此我不会阻止UI。这是我实现它的方式:
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String query) {
if (query.length() > 0) {
new GetSearchByNameResultTask(searchView).execute(query);
} else {
return false;
}
return true;
}
@Override
public boolean onQueryTextSubmit(String arg0) {
// TODO Auto-generated method stub
return false;
}
});
GetSearchByNameResultTask
class GetSearchByNameResultTask extends AsyncTask<String, Void, String> {
private SearchView searchView;
public GetSearchByNameResultTask(SearchView searchView) {
this.searchView = searchView;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
return WebRequestHelper.getInfo(params[0]);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
AppLog.d(TAG, "Result search: " + result);
Gson gson = new Gson();
searchResponseList = gson.fromJson(result, new TypeToken<List<Info>>() {
}.getType());
loadHistory(searchView, searchResponseList);
// TODO: search adapter
}
}
loadHistory()代码:
private void loadHistory(SearchView searchView, List<AppInfo> searchResponse) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
searchView.setSuggestionsAdapter(null);
// Cursor
String[] columns = new String[] { "_id", "text" };
Object[] temp = new Object[] { 0, "default" };
MatrixCursor cursor = new MatrixCursor(columns);
final List<Info> items = searchResponse;
for (int i = 0; i < items.size(); i++) {
temp[0] = i;
temp[1] = items.get(i).getName();
cursor.addRow(temp);
}
CursorAdapter ca = new AppListSearchAdapter(this, cursor, items);
new AsyncQueryResult(cursor,ca).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
// SearchView
searchView.refreshDrawableState();
searchView.setSuggestionsAdapter(ca);
searchView.setOnSuggestionListener(new OnSuggestionListener() {
@Override
public boolean onSuggestionSelect(int position) {
// TODO Auto-generated method stub
return false;
}
});
}
}
问题 一切都运行良好。我收到了搜索结果。但我在更新视图时遇到问题。可能最好用一个例子来解释:
数据:
Hell Hello Helicopter
搜索中的文字: Hel
结果:
Hello World Hello Helicopter
搜索中的文字:地狱
Hell Hello [extra empty space]
额外的空白空间是我的问题。在我输入“Hello”
之前,“listview”不会更新以适应结果答案 0 :(得分:0)
我忘了回答这个问题。
我设法解决了这个问题,虽然这对我来说有点像黑客。这就是我的所作所为:
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
searchAdapter = new SearchAdapter(this, cursor, false);
mSearchView.setSuggestionsAdapter(searchAdapter );
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
searchAdapter.notifyDataSetChanged();
}
}, 200);
//Reload fragment to show list
}
这将强制刷新搜索视图的适配器。新的Handler()。postDelayed()是这里的关键。
希望此解决方案有所帮助。