2012-07-04 7 views
8

Mam widget wyszukiwania (SearchView), wyświetlając niestandardowe sugestie podczas pisania. Śledziłem official guide, aby dodać ostatnie zapytania do sugestii, ale wciąż mam TYLKO propozycje niestandardowe.
Dla każdego wyszukiwania, mój fragment wywołać tę funkcję (niezweryfikowany):ostatnie wyszukiwania nie są wyświetlane, niestandardowe sugestie to

private void addQueryToRecent(String query) { 
    SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getActivity(), 
      MyCustomSuggestionProvider.AUTHORITY, 
      MyCustomSuggestionProvider.MODE); 
    suggestions.saveRecentQuery(query, "recent"); 
} 

Mój dostawca sugestia wydaje ok:

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

oczywisty:

  <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 do that post, mam mieć niedawne wyszukiwarki dB przy danych/data/app.package.name/baz/databasename.db, ale nie wydaje się ...
Albo Czy mam dodać "ostatnie sugestie wyszukiwania" w kursor, który zwraca MyCustomSuggestionProvider.query()? Każdy pomysł jest mile widziany ...

+0

Nie użyłeś SearchSuggestionProvider, jak to możliwe? –

Odpowiedz

6

Znaleziono go: to nie było jasne, w ogóle na Android Dokumentacji, ale potrzebuję do przeprowadzenia żądania siebie i połączyć kursorów w MyCustomSuggestionProvider.query():

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

Upewnij się, że masz te same kolumny w obu chociaż ...

+3

Jak udało ci się dowiedzieć, jak dopasować kolumny w identyczny sposób? – KickingLettuce

+0

Jak wygląda twój customCursor? –

+1

Co masz na myśli przez "upewnij się, że masz te same kolumny w obu"? –

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

Powyżej znajduje się lista kolumn używanych w ostatnich sugestii Wyszukiwanie db użyć tej samej listy dla swoich własnych sugestii wyszukiwania, aby uniknąć kolizji

+1

Nie sądzę, że wszystkie te parametry są wymagane. –

1

Aby rozwinąć na odpowiedź elgui męska, oto przykład jak ja dopasowane kolumny:

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

ponieważ ta opiera się na szczegółach związanych z implementacją SearchRecentSuggestionsProvider, może to jeszcze nie w innych sytuacjach, a to może być bardziej opłacalne napisać historię swoich nowych oszczędności i złożyć je razem.

Powiązane problemy