Android Action Bar SearchView as Autocomplete?

前端 未结 7 1297
伪装坚强ぢ
伪装坚强ぢ 2020-11-28 04:00

I am using a SearchView in the Action Bar. I want to use autocomplete feature on the search view to get results from the database.

Is this possible? Or do I need to

相关标签:
7条回答
  • 2020-11-28 04:48

    So I just had to do this for the v7 version and was dismayed to find that I cannot simply set the adapter with an ArrayAdapter.

    I did not want to use a stock AutoCompleteTextView (as the top commenter here does), because then you're missing out on a number of snazzy features of SearchView, like the little search icon and x button.

    So I extended SearchView and got this:

    public class ArrayAdapterSearchView extends SearchView {
    
    private SearchView.SearchAutoComplete mSearchAutoComplete;
    
    public ArrayAdapterSearchView(Context context) {
        super(context);
        initialize();
    }
    
    public ArrayAdapterSearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }
    
    public void initialize() {
        mSearchAutoComplete = (SearchAutoComplete) findViewById(android.support.v7.appcompat.R.id.search_src_text);
        this.setAdapter(null);
        this.setOnItemClickListener(null);
    }
    
    @Override
    public void setSuggestionsAdapter(CursorAdapter adapter) {
        // don't let anyone touch this
    }
    
    public void setOnItemClickListener(OnItemClickListener listener) {
        mSearchAutoComplete.setOnItemClickListener(listener);
    }
    
    public void setAdapter(ArrayAdapter<?> adapter) {
        mSearchAutoComplete.setAdapter(adapter);
    }
    
    public void setText(String text) {
        mSearchAutoComplete.setText(text);
    }
    
    }
    

    You can use this in your menu xml for the ActionBar like so:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto" >
    
    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_add"
        android:title="TITLE"
        app:actionViewClass="com.yourpackage.ArrayAdapterSearchView"
        app:showAsAction="ifRoom|collapseActionView"/>
    
    </menu>
    

    You may also want to add click functionality to the autocomplete list (for example, setting the text to the EditText):

    MenuItem searchItem = menu.findItem(R.id.action_search);
    final ArrayAdapterSearchView searchView = (ArrayAdapterSearchView)searchItem.getActionView();
    searchView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
            searchView.setText(adapter.getItem(position).toString());
    
        }
    });
    

    And here is a similar version for the regular old android.widget.SearchView:

    public class ArrayAdapterSearchView extends SearchView {
    
    private AutoCompleteTextView mSearchAutoComplete;
    
    public ArrayAdapterSearchView(Context context) {
        super(context);
        initialize();
    }
    
    public ArrayAdapterSearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }
    
    public void initialize() {
        mSearchAutoComplete = (AutoCompleteTextView) findViewById(getResources().getIdentifier("android:id/search_src_text", null, null));
        setAutoCompleSuggestionsAdapter(null);
        setOnItemClickListener(null);
    }
    
    @Override
    public void setSuggestionsAdapter(CursorAdapter adapter) {
        throw new UnsupportedOperationException("Please use setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) instead");
    }
    
    public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
        mSearchAutoComplete.setOnItemClickListener(listener);
    }
    
    public void setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) {
        mSearchAutoComplete.setAdapter(adapter);
    }
    
    public void setText(String text) {
        mSearchAutoComplete.setText(text);
    }
    
    }
    
    0 讨论(0)
提交回复
热议问题