gpt4 book ai didi

android - 如何使用 http 请求在 actionbar 中实现搜索 View 自动完成?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:57 25 4
gpt4 key购买 nike

我添加了 search view小部件到我的操作栏,并希望处理自动完成功能。在写了超过 3 个字母后,它应该完成对我的 Web API 的 http 请求,它将返回 json 结果并应该显示搜索小部件建议。但是在documentation观察到内容提供商的情况。如何组织自动完成功能?

在菜单 xml 文件中添加了搜索 View :

    <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" />

并最终添加了空的负责任的 Activity 。

最佳答案

您不能使用 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 来启动您的远程服务器任务或开始您的搜索 Activity :

        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;
    }
    }
    });
  • SearchView 上设置一个 OnSuggestionListener 以执行您的搜索:

        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);
    }
    });

关于android - 如何使用 http 请求在 actionbar 中实现搜索 View 自动完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com