我有一个搜索小部件(SearchView),在输入时显示自定义建议。我已按照official guide添加了最近的建议查询,但我仍然只提供自定义建议 对于每次搜索,我的片段都会调用此函数(已验证):
private void addQueryToRecent(String query) {
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getActivity(),
MyCustomSuggestionProvider.AUTHORITY,
MyCustomSuggestionProvider.MODE);
suggestions.saveRecentQuery(query, "recent");
}
我的建议提供商似乎没问题:
public class MyCustomSuggestionProvider extends SearchRecentSuggestionsProvider {
public final static String AUTHORITY = "com.zgui.musicshaker.provider.MyCustomSuggestionProvider";
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
public MyCustomSuggestionProvider() {
setupSuggestions(AUTHORITY, MODE);
}
@Override
public Cursor query(Uri uri, String[] projection, String sel,
String[] selArgs, String sortOrder) {
//retrieves a custom suggestion cursor and returns it
}
}
searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="artist, track informations..."
android:label="@string/app_name"
android:queryAfterZeroResults="true"
android:searchSuggestAuthority="com.zgui.musicshaker.provider.MyCustomSuggestionProvider"
android:searchSuggestSelection=" ?" />
清单:
<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.searchable"
android:resource="@xml/searchable" />
</activity>
<provider
android:name=".provider.MyCustomSuggestionProvider"
android:authorities="com.zgui.musicshaker.provider.MyCustomSuggestionProvider"
android:enabled="true" >
</provider>
根据that post,我应该在data / data / app.package.name / databases / databasename.db上有一个最近的搜索数据库,但我似乎没有...
或者我应该在MyCustomSuggestionProvider.query()返回的游标中添加“最近的搜索建议”?任何想法都是受欢迎的......
答案 0 :(得分:6)
找到它:在Android文档中根本不清楚,但我需要自己发出请求并在MyCustomSuggestionProvider.query()中合并游标:
Cursor recentCursor = super.query(uri, projection, sel, selArgs,
sortOrder);
Cursor[] cursors = new Cursor[] { recentCursor, customCursor};
return new MergeCursor(cursors);
确保两者都有相同的列......
答案 1 :(得分:1)
private static final String[] SEARCH_SUGGEST_COLUMNS = {
SearchManager.SUGGEST_COLUMN_FORMAT,
SearchManager.SUGGEST_COLUMN_ICON_1,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,
BaseColumns._ID };
以上是最近搜索建议数据库中使用的列列表,使用相同列表进行自定义搜索建议以避免冲突
答案 2 :(得分:1)
为了扩展elgui的答案,以下是我如何匹配列的示例:
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
final Cursor recentsCursor = super.query(uri, projection, selection, selectionArgs, sortOrder);
final Cursor customResultsCursor = queryCache(recentsCursor, selectionArgs[0]);
return new MergeCursor(new Cursor[]{recentsCursor, customResultsCursor});
}
private Cursor queryCache(Cursor recentsCursor, String userQuery) {
final MatrixCursor arrayCursor = new MatrixCursor(recentsCursor.getColumnNames());
final int formatColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT);
final int iconColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1);
final int displayColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);
final int queryColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_QUERY);
final int idIndex = recentsCursor.getColumnIndex("_id");
final int columnCount = recentsCursor.getColumnCount();
// Populate data here
int startId = Integer.MAX_VALUE;
for (String customSearchResult : customSearchResults) {
final Object[] newRow = new Object[columnCount];
if (formatColumnIndex >= 0) newRow[formatColumnIndex] = 0;
if (iconColumnIndex >= 0) newRow[iconColumnIndex] = R.drawable.invisible;
if (displayColumnIndex >= 0) newRow[displayColumnIndex] = customSearchResult;
if (queryColumnIndex >= 0) newRow[queryColumnIndex] = customSearchResult;
newRow[idIndex] = startId--;
arrayCursor.addRow(newRow);
}
return arrayCursor;
}
由于这是基于SearchRecentSuggestionsProvider的实现细节,它在其他情况下仍然可能失败,因此编写自己的最近历史并一起完成它们可能更有价值。