SearchView AsyncTask UI未正确更新

时间:2014-09-29 21:41:08

标签: android android-asynctask android-actionbar searchview

我在实现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”不会更新以适应结果

1 个答案:

答案 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()是这里的关键。

希望此解决方案有所帮助。