2015-08-24 6 views
8

Ho una installazione SearchManager in cui un elenco a discesa dei suggerimenti verrà visualizzato quando l'utente digita. I risultati sono dal mio server (http). Mi piacerebbe visualizzare un'icona con ciascuna opzione (se il file esiste di fatto).Utilizzo di un URL Web per SUGGEST_COLUMN_ICON_1 per i suggerimenti di ricerca

Guardando la documentazione, vedo le opzioni per la colonna costante SUGGEST_COLUMN_ICON_1 permette per queste opzioni:

Column name for suggestions cursor. Optional. If your cursor includes this column, then all suggestions will be provided in a format that includes space for two small icons, one at the left and one at the right of each suggestion. The data in the column must be a resource ID of a drawable, or a URI in one of the following formats: 

content (SCHEME_CONTENT) 
android.resource (SCHEME_ANDROID_RESOURCE) 
file (SCHEME_FILE) 

Tutto quello che ho è un URL. Quale opzione potrebbe funzionare meglio per me?

Ecco la class in cui sto facendo questo:

public class MyCustomSuggestionProvider extends SearchRecentSuggestionsProvider { 

    public static final String AUTHORITY = "---.MyCustomSuggestionProvider"; 
    public static final int MODE = DATABASE_MODE_QUERIES; 
    private final static String[] COLUMN_NAMES = {BaseColumns._ID, 
      SearchManager.SUGGEST_COLUMN_TEXT_1, 
      SearchManager.SUGGEST_COLUMN_TEXT_2, 
      SearchManager.SUGGEST_COLUMN_QUERY, 
      SearchManager.SUGGEST_COLUMN_INTENT_DATA, 
      SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, 
      SearchManager.SUGGEST_COLUMN_ICON_1, 
      SearchManager.SUGGEST_COLUMN_INTENT_ACTION}; 

    public MyCustomSuggestionProvider() { 
     setupSuggestions(AUTHORITY, MODE); 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
         String[] selectionArgs, String sortOrder) { 

     Cursor recentCursor = super.query(uri, projection, selection, 
       selectionArgs, sortOrder); 

     String query = selectionArgs[0]; 
     if (query == null || query.length() < 3) { 
      return recentCursor; 
     } 

     final MatrixCursor customCursor = new MatrixCursor(COLUMN_NAMES); 

     // Get web results from Retrofit Library 
     List<TheProfile> suggestions = RestClient.get().getCustomSearch(query, MyApp.getUserId()); 

     for (TheProfile suggestion : suggestions) { 


      Uri searchIconUri = Uri.parse("http:/---/profile_images/" + String.valueOf(suggestion.id) + ".png"); 
      try { 
       customCursor.addRow(new Object[]{ 
         suggestion.id, suggestion.profile, suggestion.subcategory, suggestion.profile, suggestion.profile, suggestion.subcategory, searchIconUri, "android.intent.action.SEARCH"}); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return customCursor; 
    } 
} 

risposta

4

Per quelli che stanno ancora cercando la risposta a questa domanda, come ho fatto io. È molto simile al mio codice, quindi ho deciso di condividerlo. Ho passato ore a rimettere tutto insieme. Forse, risparmierò del tempo per qualcuno. Prima di tutto, avrai bisogno dello Glide library.

Aggiungilo ai file di build.gradle della tua app:

repositories { 
    mavenCentral() // jcenter() works as well because it pulls from Maven Central 
} 

dependencies { 
    compile 'com.github.bumptech.glide:glide:3.7.0' 
    compile 'com.android.support:support-v4:19.1.0' 
} 

Ora facciamo alcune modifiche al codice della domanda (in MyCustomSuggestionProvider classe): metterlo dentro il tuo for (TheProfile suggestion : suggestions) {

FutureTarget<File> futureTarget = Glide 
     .with(getContext().getApplicationContext()) 
     .load(searchIcon) 
     .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); 

File cacheFile = futureTarget.get(); 
Uri searchIconUri = Uri.fromFile(cacheFile); 

Prestare attenzione a questa riga di codice: .with(getContext().getApplicationContext()) È molto importante ottenere il contesto dell'applicazione, non solo il contesto, poiché non verrà mostrato bmp in ImageView. Official Glide documentation per questo tipo di utilizzo Glide.

E dopo tutto è possibile chiamare:

// do things with bitmap and then release when finished: 
Glide.clear(futureTarget); 
+1

Storia vera: ho cercato ancora una volta la stessa domanda, ho trovato questa pagina e ho implementato questa soluzione. Funziona alla grande. Bene, soprattutto. Parte del problema è che mi è rimasto ho bisogno di .placeholder() e non ho ancora capito come funziona. Ma sto ottenendo le immagini. Mi stavo chiedendo perché questo non è stato segnato correttamente. Poi ho notato che ero io che ho fatto questa domanda! Bene, due anni dopo, lo sto segnando correttamente. Scusa il ritardo;) – KickingLettuce

2
  1. raccogliere fino tutti i file che si intende utilizzare come icone. Probabilmente sono sul tuo server; devi incorporarli nella tua app.

  2. Se non sono in formato .PNG, convertirli in formato .PNG. Ridimensionali alla dimensione necessaria per la visualizzazione nella tua app.

  3. Aggiungile al progetto Android nella cartella/res/drawable-mdpi. Inserendoli nella cartella specifica di mdpi verranno ridimensionati alla stessa dimensione su diverse risoluzioni del dispositivo.

  4. La prima parte del codice per le icone sta restituendo gli URI per SearchManager. Utilizzare lo schema "android.resource" nel formato:

    android.resource://<package-name>/<resource-type>/<resource-name> 
    

    Per esempio, è possibile creare un final URI per ogni icona. Ecco un esempio di un URI che ho usato nel mio progetto per /res/drawable-mdpi/ic_autocomplete_1.png:

    private final Uri searchIconUri = Uri.parse("android.resource://com.mycompany.android/drawable/ic_autocomplete_1"); 
    
  5. Come si sta loop attraverso i vostri suggerimenti, determinare quale icona è necessaria, ad esempio, con una dichiarazione switch, e mettere che URI il tuo oggetto riga, come nel tuo codice.

+0

Sì, ho pensato tanto. Qualche idea su come fare questa parte? Era parte della mia domanda, ma non l'ho spiegato molto bene. "Prendi tutte le icone che visualizzerai dal server e crea risorse disegnabili con loro". Inoltre, sto eseguendo il ciclo dei miei suggerimenti. Posso fare questo uno alla volta? (aggiungendo il codice alla domanda). – KickingLettuce

+0

no, non è necessario memorizzarli in res/drawable, poiché è possibile utilizzare sia: ID risorsa (praticamente uguale a URI con SCHEME_ANDROID_RESOURCE) o un URI n uno dei seguenti formati: SCHEME_CONTENT, SCHEME_ANDROID_RESOURCE (cosa suggerisci) o SCHEME_FILE, quindi puoi usare SCHEME_CONTENT o SCHEME_FILE per puntare al file icona – pskink

+0

@KickingLettuce, ho aggiornato la mia risposta per essere un po 'più esplicita e specifica. Fammi sapere se hai altre domande. –

Problemi correlati