Search code examples
androidandroid-actionbarormlitesearchview

Android - ActionBar SearchView suggestions with a simple String array


I want to implement an ActionBar Search Widget with suggestions ability.
I already have a string array stored in my ORMLite database that I want to use for the suggestions.
How can I do this without creating loads of classes (Provider, Searchable...!)?


Solution

  • It's a sample, I hope it can help you.

    To implements more features in this cursor, eg. open activity when press in suggestion item, take a look on this http://developer.android.com/guide/topics/search/adding-custom-suggestions.html

     package com.roberto.android.thetracker.app;
    
     import android.database.MatrixCursor;
     import android.os.Bundle;
     import android.provider.BaseColumns;
     import android.support.v4.app.Fragment;
     import android.support.v4.view.MenuItemCompat;
     import android.support.v4.widget.CursorAdapter;
     import android.support.v4.widget.SimpleCursorAdapter;
     import android.support.v7.widget.SearchView;
     import android.view.Menu;
     import android.view.MenuInflater;
    
     public class CustomSearchFragment extends Fragment {
    
         private static final String[] SUGGESTIONS = {
                 "Bauru", "Sao Paulo", "Rio de Janeiro",
                 "Bahia", "Mato Grosso", "Minas Gerais",
                 "Tocantins", "Rio Grande do Sul"
         };
         private SimpleCursorAdapter mAdapter;
    
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
    
             final String[] from = new String[] {"cityName"};
             final int[] to = new int[] {android.R.id.text1};
             mAdapter = new SimpleCursorAdapter(getActivity(),
                     android.R.layout.simple_list_item_1,
                     null,
                     from,
                     to,
                     CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
         }
    
         @Override
         public void onActivityCreated(Bundle savedInstanceState) {
             super.onActivityCreated(savedInstanceState);
             setHasOptionsMenu(true);
         }
    
         @Override
         public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
             super.onCreateOptionsMenu(menu, inflater);
             inflater.inflate(R.menu.main, menu);
         }
    
         @Override
         public void onPrepareOptionsMenu(Menu menu) {
             super.onPrepareOptionsMenu(menu);
             final SearchView searchView = (SearchView) MenuItemCompat
                     .getActionView(menu.findItem(R.id.action_search));
             searchView.setSuggestionsAdapter(mAdapter);
             searchView.setIconifiedByDefault(false);
    
             // Getting selected (clicked) item suggestion
             searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
                 @Override
                 public boolean onSuggestionClick(int position) {
                     Cursor cursor = (Cursor) mAdapter.getItem(position);
                     String txt = cursor.getString(cursor.getColumnIndex("cityName"));
                     searchView.setQuery(txt, true);
                     return true;
                 }
    
                 @Override
                 public boolean onSuggestionSelect(int position) {
                     // Your code here
                     return true;
                 }
             });
    
             searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                 @Override
                 public boolean onQueryTextSubmit(String s) {
                     return false;
                 }
    
                 @Override
                 public boolean onQueryTextChange(String s) {
                     populateAdapter(s);
                     return false;
                 }
             });
         }
    
         // You must implements your logic to get data using OrmLite
         private void populateAdapter(String query) {
             final MatrixCursor c = new MatrixCursor(new String[]{ BaseColumns._ID, "cityName" });
             for (int i=0; i<SUGGESTIONS.length; i++) {
                 if (SUGGESTIONS[i].toLowerCase().startsWith(query.toLowerCase()))
                     c.addRow(new Object[] {i, SUGGESTIONS[i]});
             }
             mAdapter.changeCursor(c);
         }
    
     }