Android:如何从网上异步获取搜索建议?

tok*_*oko 9 search android search-suggestion

我创建了一个可搜索的活动.现在,我想添加从Web服务中获取的搜索建议.我想异步获得这些建议.根据添加自定义建议,我需要覆盖查询方法,执行我的建议搜索,构建我自己的MatrixCursor并返回它.但这是问题所在,我提出建议的要求是异步的.所以当结果从net返回时它在查询方法的范围之外.

moo*_*oid 5

这是SearchView的示例,其中的建议来自网络服务(我使用过Retrofit):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_search_activity, menu);

        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));

        final CursorAdapter suggestionAdapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                null,
                new String[]{SearchManager.SUGGEST_COLUMN_TEXT_1},
                new int[]{android.R.id.text1},
                0);
        final List<String> suggestions = new ArrayList<>();

        searchView.setSuggestionsAdapter(suggestionAdapter);
        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
            @Override
            public boolean onSuggestionSelect(int position) {
                return false;
            }

            @Override
            public boolean onSuggestionClick(int position) {
                searchView.setQuery(suggestions.get(position), false);
                searchView.clearFocus();
                doSearch(suggestions.get(position));
                return true;
            }
        });

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                MyApp.autocompleteService.search(newText, new Callback<Autocomplete>() {
                    @Override
                    public void success(Autocomplete autocomplete, Response response) {
                        suggestions.clear();
                        suggestions.addAll(autocomplete.suggestions);

                        String[] columns = {
                                BaseColumns._ID,
                                SearchManager.SUGGEST_COLUMN_TEXT_1,
                                SearchManager.SUGGEST_COLUMN_INTENT_DATA
                        };

                        MatrixCursor cursor = new MatrixCursor(columns);

                        for (int i = 0; i < autocomplete.suggestions.size(); i++) {
                            String[] tmp = {Integer.toString(i), autocomplete.suggestions.get(i), autocomplete.suggestions.get(i)};
                            cursor.addRow(tmp);
                        }
                        suggestionAdapter.swapCursor(cursor);
                    }

                    @Override
                    public void failure(RetrofitError error) {
                        Toast.makeText(SearchFoodActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                        Log.w("autocompleteService", error.getMessage());
                    }
                });
                return false;
            }
        });

        return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 您能否更好地解释您的实现?就像方法doSearch(suggestions.get(position))一样?谢谢 (2认同)

Ald*_*yes 0

我发现解决这个问题的最接近的方法是使用 ContentProvider 并根据Query提供商的方法执行网络请求(即使这违背了最佳实践),结果您可以创建一个MatrixCursor如此处和此处所示的的。

我仍在寻找其他选项,例如使用 a SyncAdapter,这对于仅显示其他地方未使用的建议的目的来说似乎势不可挡。

我异步执行此操作的另一个选择是使用 AutoCompleteTextView,这样您可以创建一个自定义适配器,您可以在其中实现此答案getFilter中所示的功能。