web-dev-qa-db-fra.com

Android - Suggestions de ActionBar SearchView avec un simple tableau de chaînes

Je souhaite implémenter un widget de recherche ActionBar avec possibilité de suggestions.
Je ai déjà un tableau de chaînes stocké dans ma base de données ORMLite que je souhaite utiliser pour les suggestions.
Comment puis-je faire cela sans créer ces charges de classes (Provider, Searchable ...!)?

15
Mehdiway

C'est un échantillon, j'espère que cela peut vous aider.

Pour implémenter plus de fonctionnalités dans ce curseur, par exemple. Activité ouverte lorsque vous appuyez sur un élément de suggestion, consultez cette 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);
            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);
        }

    }
48
betorcs

Base sur la réponse de betorcs _ :

vous n'avez pas besoin d'avoir

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {...});

vous pouvez utiliser ceci, au lieu de cela

mAdapter.setFilterQueryProvider(new FilterQueryProvider() {
    @Override
    public Cursor runQuery(CharSequence constraint) {
        return populateAdapter((String) constraint);
    }
});

et sur populateAdapter, remplacez "return c;" avec "mAdapter.changeCursor (c);"

private Cursor populateAdapter(String query) {
    .
    .
    .
    return c;
}
3
Ali_dev
 private String getSuggestion(int position) {
        MatrixCursor cursor = (MatrixCursor) searchView.getSuggestionsAdapter().getCursor();
        String suggest1 = cursor.getString(position);


        return SUGGESTIONS[Integer.valueOf(suggest1)];
    }
1
Malti Patel