android - 从网络资源中搜索建议到快速搜索框中

标签 android json networking quick-search

我正在应用程序中构建搜索,需要有一种方法将从服务器获取的建议作为 JSON 数组放入快速搜索框下方显示的建议列表中。

有没有一种简单的方法可以让快速搜索框读取此类资源?

目前我正在尝试使用 ContentProvider,但接口(interface)方法清楚地表明应该查询数据库以获取建议。如果您正在搜索存储在应用程序中的数据,我想使用 ContentProvider 是正确的方法。但是,如果您需要查询网络资源,我不太确定这是正确的方法。

将我从网络获得的建议保存到本地数据库对我来说毫无意义,因为建议及其命中率会不时变化。

有人遇到过这个问题吗?或者可以指出我类似问题的方向吗?我在堆栈上找不到提到网络建议的问题。

最佳答案

这是一个 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;
}

关于android - 从网络资源中搜索建议到快速搜索框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4264589/

相关文章:

android - 动画在模拟器中不起作用

python - Celery:有没有办法编写自定义 JSON 编码器/解码器?

Android - 从远程服务器加载多个图像的有效方法

networking - ping广播地址的问题

linux - 如何从 Linux 内核进行 UDP 广播?

haskell - 为什么在下面的示例中不应该使用缓冲?

java - Intent 中的 Action_Send_Multiple 不起作用

android - 操作栏溢出菜单项不出现

Android MediaPlayer - setDataSource 和 Release - IllegalStateException

c# - 将枚举序列化为字符串时,是否可以添加新的枚举成员而不破坏与 Newtonsoft json 的契约(Contract)?