Ich möchte ein ActionBar-Such-Widget mit Vorschlagsfähigkeit implementieren.
Ich habe bereits ein String-Array in meiner ORMLite-Datenbank, das für die Vorschläge verwendet werden soll.
Wie kann ich das tun, ohne diese Klassenladungen (Provider, Searchable ...!) Zu erstellen?
Es ist eine Probe, ich hoffe es kann Ihnen helfen.
Um weitere Funktionen in diesem Cursor zu implementieren, z. Öffnen Sie die Aktivität, wenn Sie einen Vorschlag unterdrücken, und werfen Sie einen Blick auf 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);
}
}
Basis auf betorcs s Antwort :
du musst nicht haben
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {...});
sie können dies stattdessen verwenden
mAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
return populateAdapter((String) constraint);
}
});
und ersetzen Sie bei populateAdapter "return c;" mit "mAdapter.changeCursor (c);"
private Cursor populateAdapter(String query) {
.
.
.
return c;
}
private String getSuggestion(int position) {
MatrixCursor cursor = (MatrixCursor) searchView.getSuggestionsAdapter().getCursor();
String suggest1 = cursor.getString(position);
return SUGGESTIONS[Integer.valueOf(suggest1)];
}