gpt4 book ai didi

android - 为 Actionbar SearchView 创建异步 ContentProvider

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

我的 ActionBar 中有一个 SearchView,它与 ContentProvider 相连以提供搜索建议。这些建议不是来自数据库(与 ContentProvider 一样),而是来自 Web 服务。这就是为什么我必须异步处理 ContentProvider 的游标。我的代码到目前为止有效,但搜索建议总是“后面”有一个字母:

在我输入 "the" 后,我得到了之前搜索的所有结果 => "th"

在我输入 “they” 后,我得到了之前搜索的所有结果 => “the”

如何告诉 SearchView Cursor 中有新结果?我查看了 ContentObserver 和 ContentResolver().notifyChange(),但它们实际上不可能在 SearchView 的上下文中使用。

到目前为止,这是我的代码。重要的部分在 ContentProvider 的 onResponse 回调中。我创建了一个新的 MatrixCursor 并用它来覆盖成员 MatrixCursor。

AutocompleteSuggestionProvider 扩展了 ContentProvider

@Override
public Cursor query(final Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

String query = selectionArgs[0];

mNetworkHelper.startAutoCompleteRequest(
selectionArgs[0],
SuggestionCategory.EVERYTHING,
new Response.Listener<AutoCompleteResponse>() {


/**
* This is the callback for a successful web service request
*/
@Override
public void onResponse(AutoCompleteResponse response) {

MatrixCursor nCursor = new MatrixCursor(SEARCH_SUGGEST_COLUMNS, 10);
List<String> suggestions = response.getResults();

// transfrom suggestions to MatrixCursor
for (int i = 0; i < suggestions.size() && i < 10; i++)
nCursor.addRow(new String[]{String.valueOf(i), suggestions.get(i)});
}

// update cursor
mAsyncCursor = nCursor;
}
},

/**
* This is the callback for a errornous web service request
*/
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(), "Fehler", Toast.LENGTH_SHORT).show();
}
}
);
return mAsyncCursor;
}

AndroidManifest

<activity
android:name=".activities.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>

<meta-data android:name="android.app.default_searchable" android:value=".MainActivity" />
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>

</activity>

<provider
android:name=".provider.AutocompleteSuggestionProvider"
android:authorities="my.package.provider.AutocompleteSuggestion"
android:exported="false" />

searchable.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint"
android:searchSettingsDescription="@string/search_settings"

android:searchSuggestAuthority="my.package.provider.AutocompleteSuggestion"
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchSuggestSelection=" ?"
android:searchSuggestThreshold="2" >
</searchable>

最佳答案

我找到了解决方案。最重要的是要知道 ContentProvider 的查询方法不在 UI 线程上运行。因此我们可以进行同步 HTTP 调用。由于现在每个理智的人都使用 Volley,因此您必须像这样进行调用:

String url = NetworkHelper.buildRequestUrl(selectionArgs[0], SuggestionCategory.EVERYTHING, RequestType.AUTOCOMPLETE);
RequestFuture<JSONArray> future = RequestFuture.newFuture();
JsonArrayRequest request = new JsonArrayRequest(url, future, future);

mNetworkHelper.getRequestQueue().add(request);

// this does not run on the UI thread, so we can make a synchronous HTTP request
try {
JSONArray suggestions = future.get();
MatrixCursor resultCursor = new MatrixCursor(SEARCH_SUGGEST_COLUMNS, 10);

for (int i = 0; i < suggestions.length() && i < 10; i++) {
resultCursor.addRow(new String[]{String.valueOf(i), suggestions.get(i).toString()});
}

return resultCursor;

} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}

这样一切正常。

关于android - 为 Actionbar SearchView 创建异步 ContentProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24518348/

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