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 ...!)?
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);
}
}
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;
}
private String getSuggestion(int position) {
MatrixCursor cursor = (MatrixCursor) searchView.getSuggestionsAdapter().getCursor();
String suggest1 = cursor.getString(position);
return SUGGESTIONS[Integer.valueOf(suggest1)];
}