web-dev-qa-db-ja.com

httpリクエストを使用してアクションバーに検索ビューのオートコンプリートを実装するにはどうすればよいですか?

検索ビュー ウィジェットをアクションバーに追加しました。オートコンプリート機能を処理したいと思います。 3文字以上を書き込んだ後、jsonの結果を返し、検索ウィジェットの提案を表示するWebAPIへのhttpリクエストを実行する必要があります。しかし、 documentation では、コンテンツプロバイダーの場合が観察されます。オートコンプリート機能を整理するにはどうすればよいですか?

メニューxmlファイルに検索ビューを追加しました:

    <item Android:id="@+id/search"
    Android:icon="@drawable/ic_search_white_24dp"
    Android:title="Search"
    [namespace]:showAsAction="always"
    [namespace]:actionViewClass="Android.widget.SearchView" />

検索可能な構成をSearchViewに関連付けます。

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.navigation, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    return super.onCreateOptionsMenu(menu);
}

検索可能な構成を追加しました:

<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:label="@string/app_name"
    Android:hint="@string/search_hint"
    Android:searchSuggestAuthority="com.my.domain.searchable_activity" />

そして最終的には空の責任ある活動を追加しました。

10

setSearchableInfo()と検索構成ではこれを行うことはできません。

問題は、SearchViewにはCursorAdapterが必要であり、データベースではなくサーバーからデータを取得していることです。

しかし、私はこれらのステップで以前にこのようなことをしました:

  • SearchViewを使用するようにCursorAdapterを設定します。

        searchView.setSuggestionsAdapter(new SimpleCursorAdapter(
                context, Android.R.layout.simple_list_item_1, null, 
                new String[] { SearchManager.SUGGEST_COLUMN_TEXT_1 }, 
                new int[] { Android.R.id.text1 }));
    
  • AsyncTaskを作成してサーバーからJSONデータを読み取り、データからMatrixCursorを作成します。

    public class FetchSearchTermSuggestionsTask extends AsyncTask<String, Void, Cursor> {
    
        private static final String[] sAutocompleteColNames = new String[] { 
                BaseColumns._ID,                         // necessary for adapter
                SearchManager.SUGGEST_COLUMN_TEXT_1      // the full search term
        };
    
        @Override
        protected Cursor doInBackground(String... params) {
    
            MatrixCursor cursor = new MatrixCursor(sAutocompleteColNames);
    
            // get your search terms from the server here, ex:
            JSONArray terms = remoteService.getTerms(params[0]);
    
            // parse your search terms into the MatrixCursor
            for (int index = 0; index < terms.length(); index++) {
                String term = terms.getString(index);
    
                Object[] row = new Object[] { index, term };
                cursor.addRow(row);
            }
    
            return cursor;
        }
    
        @Override
        protected void onPostExecute(Cursor result) {
            searchView.getSuggestionsAdapter().changeCursor(result);
        }
    
    }
    
  • OnQueryTextListenerを設定して、リモートサーバータスクを開始するか、検索アクティビティを開始します。

        searchView.setOnQueryTextListener(new OnQueryTextListener() {
    
            @Override
            public boolean onQueryTextChange(String query) {
    
                if (query.length() >= SEARCH_QUERY_THRESHOLD) {
                    new FetchSearchTermSuggestionsTask().execute(query);
                } else {
                    searchView.getSuggestionsAdapter().changeCursor(null);
                }
    
                return true;
            }
    
            @Override
            public boolean onQueryTextSubmit(String query) {
    
                // if user presses enter, do default search, ex:
                if (query.length() >= SEARCH_QUERY_THRESHOLD) {
    
                    Intent intent = new Intent(MainActivity.this, SearchableActivity.class);
                    intent.setAction(Intent.ACTION_SEARCH);
                    intent.putExtra(SearchManager.QUERY, query);
                    startActivity(intent);
    
                    searchView.getSuggestionsAdapter().changeCursor(null);
                    return true;
                }
            }
        });
    
  • OnSuggestionListenerSearchViewを設定して、検索を実行します。

        searchView.setOnSuggestionListener(new OnSuggestionListener() {
    
            @Override
            public boolean onSuggestionSelect(int position) {
    
                Cursor cursor = (Cursor) searchView.getSuggestionsAdapter().getItem(position);
                String term = cursor.getString(cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1));
                cursor.close();
    
                Intent intent = new Intent(MainActivity.this, SearchableActivity.class);
                intent.setAction(Intent.ACTION_SEARCH);
                intent.putExtra(SearchManager.QUERY, term);
                startActivity(intent);
    
                return true;
            }
    
            @Override
            public boolean onSuggestionClick(int position) {
    
                return onSuggestionSelect(position);
            }
        });
    
17
kris larson