Es hat eine Weile gedauert, eine Lösung dafür zusammenzustellen, aber wir haben festgestellt, dass dies der einfachste Weg ist, um es so zu machen, wie Sie es beschreiben. Es gibt bessere Möglichkeiten, dies zu tun, aber da Sie Ihren Aktivitätscode nicht veröffentlicht haben, muss ich improvisieren und davon ausgehen, dass Sie zu Beginn Ihrer Aktivität eine solche Liste haben:
private List<String> items = db.getItems();
ExampleActivity.java
private List<String> items;
private Menu menu;
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.example, menu);
this.menu = menu;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();
search.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
search.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String query) {
loadHistory(query);
return true;
}
});
}
return true;
}
// History
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void loadHistory(String query) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Cursor
String[] columns = new String[] { "_id", "text" };
Object[] temp = new Object[] { 0, "default" };
MatrixCursor cursor = new MatrixCursor(columns);
for(int i = 0; i < items.size(); i++) {
temp[0] = i;
temp[1] = items.get(i);
cursor.addRow(temp);
}
// SearchView
SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();
search.setSuggestionsAdapter(new ExampleAdapter(this, cursor, items));
}
}
Jetzt müssen Sie einen Adapter erstellen, der erweitert ist aus CursorAdapter
:
ExampleAdapter.java
public class ExampleAdapter extends CursorAdapter {
private List<String> items;
private TextView text;
public ExampleAdapter(Context context, Cursor cursor, List<String> items) {
super(context, cursor, false);
this.items = items;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
text.setText(items.get(cursor.getPosition()));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item, parent, false);
text = (TextView) view.findViewById(R.id.text);
return view;
}
}
Eine bessere Möglichkeit, dies zu tun, besteht darin, wenn Ihre Listendaten aus einer Datenbank stammen, die Cursor
von der Datenbank zurückgegebenen Funktionen direkt an ExampleAdapter
die entsprechende Spaltenauswahl zu übergeben und den entsprechenden Spaltentext zu verwenden, um den Spaltentext in dem TextView
im Adapter angegebenen anzuzeigen .
Bitte beachten Sie: Wenn Sie importieren, importieren CursorAdapter
Sie nicht die Android-Support-Version, android.widget.CursorAdapter
sondern stattdessen den Standard .
Der Adapter benötigt außerdem ein benutzerdefiniertes Layout:
res / layout / item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/item"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Sie können jetzt Listenelemente anpassen, indem Sie dem Layout zusätzliche Text- oder Bildansichten hinzufügen und diese mit Daten im Adapter füllen.
Dies sollte alles sein, aber wenn Sie dies noch nicht getan haben, benötigen Sie einen SearchView-Menüpunkt:
res / menu / example.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/search"
android:title="@string/search"
android:showAsAction="ifRoom"
android:actionViewClass="android.widget.SearchView" />
</menu>
Erstellen Sie dann eine durchsuchbare Konfiguration:
res / xml / searchable.xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search"
android:hint="@string/search" >
</searchable>
Fügen Sie dies schließlich in das entsprechende Aktivitäts-Tag in der Manifest-Datei ein:
AndroidManifest.xml
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value="com.example.ExampleActivity" />
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
Bitte beachten Sie: Die @string/search
in den Beispielen verwendete Zeichenfolge sollte in values / strings.xml definiert sein. Vergessen Sie auch nicht, den Verweis auf com.example
für Ihr Projekt zu aktualisieren .