2012-07-04 3 views
8

У меня есть виджет поиска (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> 

Acording к that post, я должен иметь недавний поиск по БД данных/данных/app.package.name/базы данных/databasename.db, но я, кажется, не ...
Или, может быть, я должен добавить «последние предложения поиска» сам в курсор, который возвращает MyCustomSuggestionProvider.query()? Любая идея приветствуется ...

+0

Вы не использовали SearchSuggestionProvider, почему? –

ответ

6

Нашел: это было не ясно, все на Android документации, но мне нужно сделать запрос себя и объединить курсоры в MyCustomSuggestionProvider.query():

Cursor recentCursor = super.query(uri, projection, sel, selArgs, 
      sortOrder); 
Cursor[] cursors = new Cursor[] { recentCursor, customCursor}; 
return new MergeCursor(cursors); 

Убедитесь, что у вас есть те же столбцы в обоих, хотя ...

+3

Как вы выяснили, как одинаково сопоставлять столбцы? – KickingLettuce

+0

Как выглядит ваш пользовательский курсор? –

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

Выше приведен список столбцов, используемых в последних поисковых подсказках дб, использовать тот же список для пользовательских поисковых подсказок, чтобы избежать столкновения

+1

Я не думаю, что все эти параметры требуются. –

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, она все еще может потерпеть неудачу в других ситуациях, и это могло бы быть более полезным писать собственную историю рецензий и делать их вместе.

Смежные вопросы