2013-02-20 4 views
2

Я пытаюсь создать фильтр в списке с помощью вида поиска ActionBarSherlock. Код, который я в настоящее время заключается в следующем:Actionbarsherlock searchview: setOnQueryTextListener

@Override 
public boolean onCreateOptionsMenu(final Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.building_search, menu); 

    SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); 

    SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() 
    { 
     public boolean onQueryTextChange(String newText) 
     { 
      // this is your adapter that will be filtered 
      listAdapter.getFilter().filter(newText); 
      return true; 
     } 

     public boolean onQueryTextSubmit(String query) 
     { 
      // this is your adapter that will be filtered 
      listAdapter.getFilter().filter(query); 
      return true; 
     } 
    }; 
    searchView.setOnQueryTextListener(queryTextListener); 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.search: 
      onSearchRequested(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

Это мой импорт:

import android.os.Bundle; 
import android.widget.AbsListView; 
import android.widget.ArrayAdapter; 
import be.ugent.zeus.hydra.AbstractSherlockActivity; 
import be.ugent.zeus.hydra.R; 
import be.ugent.zeus.hydra.data.caches.AssociationsCache; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuItem; 
import com.actionbarsherlock.widget.SearchView; 
import com.dd.plist.NSArray; 
import com.dd.plist.NSDictionary; 
import com.dd.plist.NSString; 
import com.dd.plist.XMLPropertyListParser; 
import com.emilsjolander.components.stickylistheaders.StickyListHeadersListView; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

Большинство из них работает: в моем ActionBar, я получаю значок поиска, который интерактивный и расширяет SearchView , То, что, однако, не работает, является фактическим слушателем. Я поставил точки останова в обоих методах, но когда я отлаживаю, ничего не происходит. Программа не ломается, и ничто не фильтруется, и я не могу понять, почему.

Есть ли идеи?

Заранее спасибо.

+0

Не можете добавить в личный список объявления? –

+0

Я добавил их к исходному вопросу. – Silox

ответ

1

Поскольку каждый другой ответ содержал немного правды, но не полностью ответил на вопрос, я создам свой собственный ответ.

Когда эта проблема была создана - полгода назад - ABS не полностью реализовала функциональность SearchView. Начиная с ABS 4.2.0, это было реализовано.

Мою полную реализацию, следуя образцу приложения ABS, можно найти here.

1

Это ваш полный код? Прямо сейчас в onCreateOptionsMenu вы создаете SearchView и назначаете ему OnQueryTextListener, но это все, что вы с ним делаете. Я не вижу в вашем коде, где вы добавляете это SearchView в завышенное меню.

Как вы говорите, вы видите виджет на экране, я предполагаю, что вы указали виджет в файле R.menu.building_search, и в этом случае вы должны искать этот виджет (который не имеет на нем слушателя, поэтому никаких действий не выполняется) и не объявлять новый (который не будет взаимодействовать с пользователем):

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 

(Это из поиска руководства на андроида сайте разработчика, если я не ошибаюсь, это должно работать для ActionBarSherlock).

5

Это, как я реализовал свой поиск с ActionBarSherlock:

В menu.xml в папке Рез/меню, я добавил значок:

<item android:id="@+id/search" 
     android:title="@string/search_title" 
     android:icon="@drawable/ic_search" 
     android:showAsAction="collapseActionView|ifRoom" 
     android:actionViewClass="com.actionbarsherlock.widget.SearchView"/> 

Затем я создал класс, который отвечает для ПОЛУЧАТЬ поисковые запросы действий и представление данных:

public class SearchActivity extends SherlockFragmentActivity{ 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     Log.d(TAG, "This is the search view activity"); 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.search_result_layout); 
      } 


    private void handleIntent(Intent intent){ 
     if(Intent.ACTION_SEARCH.equals(intent.getAction())){ 
     searcdhQuery = intent.getStringExtra(SearchManager.QUERY); 
     //here we shall do e search.. 
     Log.d(TAG, "This is the search query:" + searcdhQuery); 

        //This is the asynctask query to connect to the database... 
     String[] value = {searcdhQuery}; 
     SearchQuery searchQuery = new SearchQuery(); 
     searchQuery.execute(value); 
     } 
     } 

      @Override 
     protected void onNewIntent(Intent intent) { 
     // TODO Auto-generated method stub 
     super.onNewIntent(intent); 
     handleIntent(intent); 
     } 
     } 

В манифесте, эта деятельность входят поиск и просмотр фильтры, как показано ниже:

<activity android:name=".SearchActivity" 
     android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable"/> 
    </activity> 

Кроме того, в манифесте, не забывайте о мета-данных в приложении с указанием поиска по умолчанию деятельности, как показано ниже:

<meta-data android:name="android.app.default_searchable" 
        android:value=".SearchActivity" /> 

Наконец в onCreateOptionsMenu, обязательно добавить конфигурацию поиска, связывая его со службой поиска:

//associating the searchable configuration with the search service... 
    SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView)menu.findItem(R.id.search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

Ничто не требуется в onOptionsItemSelected метода.

Это отлично сработало для меня. Если вам нужна дополнительная информация, пожалуйста, найдите дополнительную информацию от Search View Demo в действииBarSherlock и developers tutorial on the Setting a Search Interface.

Надеюсь, это поможет.

+0

И где вы прикрепляете onQueryTextListener? Я хочу обновить список, который я покажу, когда пользователь печатает. Я не вижу этого в вашем коде. – Silox

+0

Я не реализовал в текстовом списке запрос, но я думаю, что, например, @Luksprog, упомянутый ниже, он должен быть прикреплен к SearchView при настройке метода onOptionsItemSelected. –

3

В случае, если вы не нашли ответ, это то, как я это делаю (я использую ActionBarSherlock):

  • добавить запись в декларации меню

    <item android:id="@+id/menu_search" 
        android:actionViewClass="com.actionbarsherlock.widget.SearchView" 
        android:icon="@drawable/wfm_menu_search" 
        android:showAsAction="always|withText|collapseActionView" 
        android:title="@string/menu_search"/> 
    
  • в вашей деятельности переопределение «onCreateOptionsMenu», чтобы надуть меню и связать SearcView:

    public boolean onCreateOptionsMenu(final Menu menu) { 
        getSupportMenuInflater().inflate(R.menu.main_menu, menu); 
        this.refreshMenuItem = menu.findItem(R.id.menu_refresh); 
    
        this.searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
        this.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
    
        @Override 
        public boolean onQueryTextSubmit(String query) { 
         // collapse the view ? 
         menu.findItem(R.id.menu_search).collapseActionView(); 
         return false; 
        } 
    
        @Override 
        public boolean onQueryTextChange(String newText) { 
         // search goes here !! 
         // listAdapter.getFilter().filter(query); 
         return false; 
        } 
    
    }); 
    

Все, никаких других действий. Надеюсь, вы найдете ее полезной.

+0

this.searchView означает ??? Где его объявили. ?? –

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