2012-07-04 27 views
8

Tengo un widget de búsqueda (SearchView), que muestra sugerencias personalizadas mientras se escribe. Seguí official guide para agregar consultas recientes a sugerencias, pero todavía tengo sugerencias personalizadas SOLAMENTE.
Por cada búsqueda, mi fragmento de llamar a esta función (verificado):no se muestran las búsquedas recientes, las sugerencias personalizadas son

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

Mi proveedor sugerencia parece bien:

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

manifiesta:

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

según that post, se supone que debo tener una reciente db búsqueda en los datos/datos/app.package.name/bases de datos/databasename.db, pero no me parece que ...
O tal ¿Se supone que debo agregar las "sugerencias de búsqueda recientes" en el cursor que devuelve MyCustomSuggestionProvider.query()? Cualquier idea es bienvenida ...

+0

Usted no usó un SearchSuggestionProvider, ¿por qué? –

Respuesta

6

encontrado que: que no estaba claro en absoluto sobre la documentación de Android, pero tengo que hacer la petición a mí mismo y fusionar los cursores en MyCustomSuggestionProvider.query():

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

Asegúrese de que tiene las mismas columnas en tanto aunque ...

+3

¿Cómo descubrió cómo hacer coincidir columnas de forma idéntica? – KickingLettuce

+0

¿Cómo se ve tu CustomCursor? –

+1

¿Qué quiere decir con "asegúrese de tener las mismas columnas en ambos"? –

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

por encima de la lista de columnas que se usan en los últimos db sugerencias de búsqueda, use misma lista para sus sugerencias de búsqueda personalizados para evitar enfrentamientos

+1

No creo que se requieran todos esos parámetros. –

1

Para ampliar sobre la respuesta de elgui, aquí está un ejemplo de cómo encajaban las columnas:

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

Dado que este se basa en los detalles de implementación de SearchRecentSuggestionsProvider, todavía podría fracasar en otras situaciones y podría ser más útil para escribir tu propio historial reciente y hacerlos juntos.

Cuestiones relacionadas