2016-06-06 18 views
7

İşlem çubuğuma search view widget'ını ekledim ve otomatik tamamlama özelliğini kullanmak istiyorum. 3 harf daha yazdıktan sonra, json sonucunu döndürecek ve arama widget'ı önerilerini gösterecek olan web API’mın http isteğini yerine getirmesi gerekir. Ancak, içerik sağlayıcılarıyla durum documentation'da görülmektedir. Otomatik tamamlama özelliğini nasıl düzenleyebilirim?http isteği kullanarak arama görünümü otomatik tamamlama eylem çubuğuna nasıl uygulanır?

menü xml dosyasında

Eklenen arama görünümü :

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.navigation, menu); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

    return super.onCreateOptionsMenu(menu); 
} 

Eklendi aranabilir yapılandırma:

<item android:id="@+id/search" 
    android:icon="@drawable/ic_search_white_24dp" 
    android:title="Search" 
    [namespace]:showAsAction="always" 
    [namespace]:actionViewClass="android.widget.SearchView" /> 

Associates aranabilir SearchView ile yapılandırma sonuçta

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/app_name" 
    android:hint="@string/search_hint" 
    android:searchSuggestAuthority="com.my.domain.searchable_activity" /> 

Ve boş sorumlu aktiviteyi eklendi .

+0

Şimdiye kadar çalıştığınız şeyi:aramanızı yürütmek için? –

+0

http isteği ile çözüm bulmanız gerekiyor. –

+0

lütfen şu ana kadar ne yaptınız? –

cevap

14

Bunu setSearchableInfo() ve bir arama yapılandırması ile yapamazsınız.

Sorun, SearchView'un CursorAdapter'a ihtiyaç duymasıdır ve veri tabanından değil sunucudan veri alıyorsunuzdur.

Ancak, önce bu adımlarla böyle bir şey yapmış:

  • bir CursorAdapter kullanmak için SearchView ayarlayın; Uzak sunucu görevi başlaması veya arama etkinliğinizi başlatmak için

    public class FetchSearchTermSuggestionsTask extends AsyncTask<String, Void, Cursor> { 
    
        private static final String[] sAutocompleteColNames = new String[] { 
          BaseColumns._ID,       // necessary for adapter 
          SearchManager.SUGGEST_COLUMN_TEXT_1  // the full search term 
        }; 
    
        @Override 
        protected Cursor doInBackground(String... params) { 
    
         MatrixCursor cursor = new MatrixCursor(sAutocompleteColNames); 
    
         // get your search terms from the server here, ex: 
         JSONArray terms = remoteService.getTerms(params[0]); 
    
         // parse your search terms into the MatrixCursor 
         for (int index = 0; index < terms.length(); index++) { 
          String term = terms.getString(index); 
    
          Object[] row = new Object[] { index, term }; 
          cursor.addRow(row); 
         } 
    
         return cursor; 
        } 
    
        @Override 
        protected void onPostExecute(Cursor result) { 
         searchView.getSuggestionsAdapter().changeCursor(result); 
        } 
    
    } 
    
  • Set bir OnQueryTextListener:

    searchView.setSuggestionsAdapter(new SimpleCursorAdapter(
          context, android.R.layout.simple_list_item_1, null, 
          new String[] { SearchManager.SUGGEST_COLUMN_TEXT_1 }, 
          new int[] { android.R.id.text1 })); 
    
  • sunucunuzdan JSON verilerini okumak ve verilerden bir MatrixCursor oluşturmak için bir AsyncTask oluştur :

    searchView.setOnQueryTextListener(new OnQueryTextListener() { 
    
         @Override 
         public boolean onQueryTextChange(String query) { 
    
          if (query.length() >= SEARCH_QUERY_THRESHOLD) { 
           new FetchSearchTermSuggestionsTask().execute(query); 
          } else { 
           searchView.getSuggestionsAdapter().changeCursor(null); 
          } 
    
          return true; 
         } 
    
         @Override 
         public boolean onQueryTextSubmit(String query) { 
    
          // if user presses enter, do default search, ex: 
          if (query.length() >= SEARCH_QUERY_THRESHOLD) { 
    
           Intent intent = new Intent(MainActivity.this, SearchableActivity.class); 
           intent.setAction(Intent.ACTION_SEARCH); 
           intent.putExtra(SearchManager.QUERY, query); 
           startActivity(intent); 
    
           searchView.getSuggestionsAdapter().changeCursor(null); 
           return true; 
          } 
         } 
        }); 
    
  • bir OnSuggestionListener Set

    searchView.setOnSuggestionListener(new OnSuggestionListener() { 
    
         @Override 
         public boolean onSuggestionSelect(int position) { 
    
          Cursor cursor = (Cursor) searchView.getSuggestionsAdapter().getItem(position); 
          String term = cursor.getString(cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1)); 
          cursor.close(); 
    
          Intent intent = new Intent(MainActivity.this, SearchableActivity.class); 
          intent.setAction(Intent.ACTION_SEARCH); 
          intent.putExtra(SearchManager.QUERY, term); 
          startActivity(intent); 
    
          return true; 
         } 
    
         @Override 
         public boolean onSuggestionClick(int position) { 
    
          return onSuggestionSelect(position); 
         } 
        }); 
    
+0

Teşekkürler, benim için çalışıyor. Benim durumumda öneri çizgisi, bir kullanıcı simgesini, adı, konumu ve görüntü düğmesini temsil eder. Ne tür bir CursorAdapter sunabilirsiniz? –

+0

Bu durumda, 'MatrixCursor'unuz 5 alana sahip olacaktır: '_id' alanı, simge alanı, ad alanı, konum alanı ve görüntü alanı. 'SimpleCursorAdapter' muhtemelen simge ve görüntü için yeterli olmayacaktır, bu yüzden 'CursorAdapter' alt sınıfını ve newView() 'i özel bir düzeni şişirmek ve imleç verilerini düzeninize eşlemek için bindView()' ı kullanmanız gerekir. widget'lar. BindView() 'hakkında bir not: Bir 'İmleç' iletildi ama hiçbir pozisyonu. Bunun nedeni, imlecin zaten doğru kayıtlara yerleştirilmiş olması; Tek yapmanız gereken mevcut alan değerlerini almak. –

+0

Harika yanıt; sadece hızlı düzeltme: OnPostExecute içinde changeCursor çağrısında, argüman 'olması result' gerektiğini değil' herkesin dikkatini ödeme ise sadece görmek vermedi – Grandclosing

İlgili konular