2014-12-22 3 views
3

У меня есть рабочий поиск Activity, который запрашивает удалённую базу данных при отправке ввода в ActionBarandroid.support.v7.widget.SearchView (ввод «Go» на мягкой клавиатуре). Это прекрасно работает, но в конечном итоге я хотел бы запросить базу данных каждый раз, когда текст SearchView изменяется путем добавления или удаления символа. Мой код инициализации SearchView приведен ниже.Выполнять поиск при вводе

SearchFragment.java (дочерний фрагмент поиск Activity упомянутых выше)

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.menu_search, menu); 

    // Get the searchable.xml data about the search configuration 
    final SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); 
    SearchableInfo searchInfo = searchManager.getSearchableInfo(getActivity().getComponentName()); 
    // Associate searchable configuration with the SearchView 
    mSearchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView(); 
    mSearchView.setSearchableInfo(searchInfo); 
    mSearchView.requestFocus(); 
    mSearchView.onActionViewExpanded(); 
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      mSearchListAdapter.clear(); 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String query) { 
      mSearchListAdapter.clear(); 
      // Execute search ... 
      return false; 
     } 
    }); 
} 

Я представляю себе работу должен быть сделан в рамках onQueryTextChange(String query) метода выше, но я не уверен, что должно быть называется. Я думал о вызове метода экземпляра SearchManagerstartSearch, но это не кажется лучшей практикой. Кто-нибудь имеет опыт работы с типом поиска и будет готов поделиться эффективным решением?

UPDATE:

MainActivity.java (поиска Activity)

@Override 
protected void onNewIntent(Intent intent) { 
    setIntent(intent); 

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     // Handle the search for a particular musical object 
     final SearchFragment searchFragment = (SearchFragment) getFragmentManager().findFragmentByTag(SearchFragment.TAG); 
     String query = intent.getStringExtra(SearchManager.QUERY); 

     mWebService.searchTracks(query, new Callback<Pager>() { 
      @Override 
      public void success(Pager results, Response response) { 
       Log.d(TAG, "Search response received."); 
       searchFragment.updateItems(results); 
      } 
      @Override 
      public void failure(RetrofitError retrofitError) { 
       Log.e(TAG, "Search response failed: " + retrofitError.toString()); 
      } 
     }); 

выше search interface design является то, что в Android команды в Google рекомендуется.

ответ

1

До сих пор единственным решением, которое я наткнулся после прочтения нескольких страниц документации просто отправив намерения с Intent.ACTION_SEARCH действия и текущий запрос от SearchView, чтобы начать поиск Activity при изменении текста SearchView. Имейте в виду, что это, вероятно, не лучшая практика с точки зрения дизайна SearchManager, но он работает. Я вернусь к этому подходу позже и отчитаюсь здесь, если увижу что-то новое.

@Override 
public boolean onQueryTextChange(String query) { 
    mSearchListAdapter.clear(); 
    if (!query.isEmpty()) { 
      Intent searchIntent = new Intent(getActivity(), MainActivity.class); 
      searchIntent.setAction(Intent.ACTION_SEARCH); 
      searchIntent.putExtra(SearchManager.QUERY, query); 
      startActivity(searchIntent); 
    } 
    return false; 
} 
0

Это идеальное решение для проблемы, которую вы ищете.

Смотрите это, это поможет вам ... Android Action Bar SearchView as Autocomplete?

+0

Я не хочу предлагать варианты автозаполнения. Я просто ищу способ выполнить поисковый запрос в удаленной базе данных каждый раз, когда символ вводится или удаляется из '' 'SearchView'''. – Ryan

+0

Запустил ли вы вызов api на другой удаленный сервер? – Rohit5k2

+0

Да. Это потребовало бы вызова API каждый раз, когда текст '' 'SearchView'' был изменен. В основном я ищу способ _correct_ для вызова поисковой службы поиска '' 'Activity''', когда текст запроса изменяется. – Ryan

0

В случае, если вы все еще ищете лучшее решение: я только что нашел this ответ на подобный вопрос, который использует

searchView.setOnQueryTextListener(this); 

это именно то, что вы хотите.

Смежные вопросы