2012-07-04 9 views
8

Ho un widget di ricerca (SearchView), visualizzazione di suggerimenti personalizzati durante la digitazione. Ho seguito official guide per aggiungere query recenti ai suggerimenti, ma ho ancora solo suggerimenti personalizzati.
Per ogni ricerca, il mio frammento chiamare questa funzione (verificato):le ricerche recenti non vengono visualizzate, i suggerimenti personalizzati sono

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

mio provider suggerimento sembra 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=" ?" /> 

manifestare:

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

di tronchi con a that post, dovrei avere una recente db ricerca in dati/data/app.package.name/database/databasename.db, ma non mi sembra ...
O forse dovrei aggiungere io stesso i "suggerimenti di ricerca recenti" nel cursore restituito da MyCustomSuggestionProvider.query()? Qualsiasi idea è benvenuto ...

+0

Non hai utilizzato un SearchSuggestionProvider, come mai? –

risposta

6

trovato: non era chiaro a tutti in materia di documentazione Android, ma ho bisogno di fare la richiesta me stesso e unire i cursori in MyCustomSuggestionProvider.query():

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

assicurarsi di avere le stesse colonne in entrambe però ...

+3

Come hai capito come abbinare le colonne in modo identico? – KickingLettuce

+0

Che aspetto ha il tuo CustomCursor? –

+1

Cosa intendi con "assicurati di avere le stesse colonne in entrambi"? –

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

Sopra è l'elenco delle colonne utilizzate negli ultimi db suggerimenti per la ricerca, utilizzare stessa lista per la vostra abitudine suggerimenti di ricerca al fine di evitare scontri

+1

Non credo che tutti questi parametri siano obbligatori. –

1

Per espandere sulla risposta di elgui, ecco un esempio di come ho abbinato le colonne:

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

Dal momento che questo si basa sui dettagli di implementazione di SearchRecentSuggestionsProvider, potrebbe ancora fallire in altre situazioni e potrebbe essere più utile scrivere la tua storia personale e farli insieme.