Android – ActionBar SearchView suggerimenti con un semplice array di stringhe

Vorrei implementare un ActionBar Widget di Ricerca con i suggerimenti di capacità.
Ho già una matrice di stringhe memorizzate nel mio ORMLite database che si desidera utilizzare per i suggerimenti.
Come posso fare senza creare carichi di classi (Provider, Ricercabili…!)?

  • Craete personalizzato CursorAdapter popolare utilizzando MatrixCursor, e impostare la scheda SearchView developer.android.com/reference/android/support/v7/widget/…, fatemi sapere se questa info è stata sufficiente.
  • Nei documenti si dice che c’è un costruttore come questo CursorAdapter(Context context, Cursor cursor). Io cerco di fare questo new CursorAdapter(this, matrix) con matrice essere un MatrixCursor che ho creato. Ma è impossibile creare un’istanza di un CursorAdapter… ?
InformationsquelleAutor Mehdiway | 2014-05-14

 

3 Replies
  1. 51

    È un campione, spero che ti può aiutare.

    A implementa le funzionalità di più in questo cursore, ad esempio. aprire attività quando si preme il tasto di suggestione voce, date un’occhiata a questo 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);
            }
    
        }
    • Ho implementato il codice correttamente, ho avuto la cronologia matrice dal mio ORMLite database, tutto viene compilato senza errori. Ad eccezione di quando si immette un carattere che è un inizio di una stringa nel database, non succede nulla, e quando inserisco il secondo personaggio ho ArrayIndexOutOfBoundsException… non ho idea del perché…
    • Inserire qui il codice è più facile aiutarti.
    • Qui : snipt.org/VCy7#expand ho convertito la matrice di Stringa per ArrayList in modo da poter aggiungere in un secondo tempo.
    • Nel tuo codice, searchHistoryList cambia la dimensione secondo si modifica il SearchView, es.: Prima lettera ‘T’, 3 ‘Ta…’, ‘Th…’, ‘Th…’, Secondo la lettera ‘h’, 2 risultati: “Th…’ e ‘A…’, hai capito?
    • searchHistoryList non cambia… è inizializzato una volta nel metodo oncreateoptionsmenu.
    • Penso che dire la MatrixCursor che cambia
    • Sembra essere di destra.. la linea che stai ricevendo questa Eccezione?
    • Penso di sorgente, modificare int[] to = new int[] { 0, R.id.simpleListItemText }; per int[] to = new int[] { R.id.simpleListItemText };
    • Grazie, finalmente a lavorare ! Ma adesso quando faccio clic sul suggerimento, non succede nulla… credo che mi limiterò a guardare in su. Grazie di nuovo 😉
    • Ehi, u Può dirmi come posso ottenere elemento selezionato stringa di suggestione adattatore
    • si prega di dare un’occhiata nella mia ultima modifica, si può aiutare.
    • Grazie per l’esempio! Una cosa da ricordare che è anche la necessità di chiamare adapter.notifyDataSetChanged() dopo la chiamata adapter.changeCursor(cursor) altrimenti elenco dei suggerimenti potrebbe diventare fuori sync.
    • Può aggiungere a onSuggestionClick(int posizione): Cursor = (Cursore) mAdapter.getItem(posizione); String txt = cursore.getString(cursore.getColumnIndex(“cityName”)); searchView.setQuery(txt, true); Quindi, dopo aver selezionato qualcosa suggerimenti apparirà in searchView!
    • Grazie, Molto utile esempio. salvato il mio giorno @betorcs
    • ottima soluzione!
    • che cosa è e a ? @betorcs
    • sono cursore colonne nome e to sono viste id
    • ehi, funziona, ma quando devo inserire il primo carattere i dati non sono aggiornati in searchView. qualche idea del perché? non appena inserisco il 2 ° carattere i suggerimenti del primo carattere diventa visibile per una frazione di secondo e viene sostituito da nuove suggestioni. Ho provato ad aggiungere il notifyDataSetChanged, ma niente da fare.
    • quando si immette il primo carattere, è innescando onQueryTextChange?
    • sì..anche l’adattatore.changeCursor() è anche sempre attivato
    • finalmente ho trovato il problema, la soglia predefinita di completamento automatico textview è di 2 caratteri che non per motivi di lavoro per un singolo carattere. Ho dovuto fare questo ((AutoCompleteTextView) searchView.findViewById(R. id.search_src_text)).setThreshold(1); per modificare il valore di soglia predefinito.

  2. 4

    Base betorcs‘s risposta :

    non c’è bisogno di avere

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

    è possibile utilizzare per questo, invece che

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

    e populateAdapter, Sostituire “return c;” con “mAdapter.changeCursor(c);”

    private Cursor populateAdapter(String query) {
        .
        .
        .
        return c;
    }
  3. 1
     private String getSuggestion(int position) {
            MatrixCursor cursor = (MatrixCursor) searchView.getSuggestionsAdapter().getCursor();
            String suggest1 = cursor.getString(position);
    
    
            return SUGGESTIONS[Integer.valueOf(suggest1)];
        }
    • Mentre questo codice potrebbe rispondere alla domanda si potrebbe considerare l’aggiunta di un paio di frasi esplicative come questo aumenta il valore della vostra risposta per gli altri utenti.

Lascia un commento