2015-08-24 16 views
8

Mam konfigurację SearchManager, w której lista sugestii będzie wyświetlana w miarę pisania przez użytkownika. Wyniki pochodzą z mojego serwera (http). Chciałbym wyświetlić ikonę z każdą opcją (jeśli plik faktycznie istnieje).Używanie adresu URL strony internetowej dla SUGGEST_COLUMN_ICON_1 dla sugestii wyszukiwania

Patrząc na docs, widzę możliwości stałej kolumnie SUGGEST_COLUMN_ICON_1 umożliwia opcji:

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) 

Wszystko co mam to URL. Która opcja będzie dla mnie najlepsza?

Oto class gdzie robie to:

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

Odpowiedz

4

Dla tych, którzy wciąż szukają odpowiedzi na to pytanie, tak jak ja. Jest bardzo podobny do mojego kodu, więc zdecydowałem się go udostępnić. Spędziłem godziny, składając to wszystko razem. Może, zaoszczędzę trochę czasu komuś. Przede wszystkim potrzebujesz Glide library.

Dodaj go do pliku build.gradle swojej aplikacji:

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

Teraz zróbmy kilka zmian w kodzie od kwestii (w MyCustomSuggestionProvider klasie): Umieścić go wewnątrz 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); 

Należy zwrócić uwagę na następujący wiersz kodu: .with(getContext().getApplicationContext()) To bardzo ważne, aby uzyskać kontekst aplikacji, a nie tylko kontekst, ponieważ nie zamierzamy wyświetlać bmp w ImageView. Official Glide documentation dla tego typu użycia Glide.

A przecież można zadzwonić:

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

Prawdziwa historia: Po raz kolejny przeszukałem to samo pytanie, znalazłem tę stronę i zaimplementowałem to rozwiązanie. Działa świetnie. Cóż, głównie. Częścią problemu jest to, że to, co mi zostało, to to, czego potrzebuję .placeholder() i nie wymyśliłem jeszcze, by pracować z powyższym. Ale dostaję obrazy. Zastanawiałem się, dlaczego to nie jest oznaczone jako poprawne. Wtedy zauważyłem, że to ja zadałem to pytanie! Cóż, dwa lata później zaznaczam to poprawnie. Przepraszam za opóźnienie ;) – KickingLettuce

2
  1. zebrać się wszystkie pliki, które zamierzasz użyć jako ikony. Są prawdopodobnie na twoim serwerze; musisz je osadzić w swojej aplikacji.

  2. Jeśli nie ma ich w formacie .PNG, przekonwertuj je do formatu .PNG. Skaluj je do rozmiaru wymaganego do wyświetlania w aplikacji.

  3. Dodaj je do swojego projektu Android w folderze/res/drawable-mdpi. Umieszczenie ich w folderze specyficznym dla mdpi spowoduje skalowanie ich w tym samym rozmiarze w różnych rozdzielczościach urządzeń.

  4. Pierwsza część kodu ikon ma identyfikatory URI do zwrotu dla SearchManager. Użyj „android.resource” schemat w formacie:

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

    Na przykład, można utworzyć final URI dla każdej ikony. Oto przykład URI, że użyłem w moim projekcie dla /res/drawable-mdpi/ic_autocomplete_1.png:

    private final Uri searchIconUri = Uri.parse("android.resource://com.mycompany.android/drawable/ic_autocomplete_1"); 
    
  5. Jak jesteś zapętlenie poprzez swoje propozycje, określić, które ikona jest to konieczne, na przykład za pomocą switch oświadczenia i umieścić ten URI w twój obiekt wiersza, tak jak w swoim kodzie.

+0

Tak, przyjęto tyle. Masz pomysł, jak wykonać tę część? To było częścią mojego pytania, ale nie wyjaśniłem tego bardzo dobrze. "Chwyć wszystkie ikony, które będziesz wyświetlał z serwera, i twórz z nich zasoby do rysowania". Ponadto przeglądam wyniki moich sugestii. Czy mogę to zrobić po jednym na raz? (dodawanie kodu do pytania). – KickingLettuce

+0

Nie, nie musisz ich w ogóle przechowywać w res/drawable, ponieważ możesz użyć albo: identyfikatora zasobu (całkiem takiego samego jak URI z SCHEME_ANDROID_RESOURCE) albo identyfikatora URI n jednego z następujących formatów: SCHEME_CONTENT, SCHEME_ANDROID_RESOURCE (co sugerujesz) lub SCHEMAT_FILE, dzięki czemu możesz użyć SCHEME_CONTENT lub SCHEME_FILE do wskazania pliku ikony – pskink

+0

@KickingLettuce, zaktualizowałem swoją odpowiedź, aby była trochę bardziej wyraźna i konkretna. Daj mi znać, jeśli masz więcej pytań. –

Powiązane problemy