Потрібен був час, щоб зібрати рішення для цього, але виявили, що це найпростіший спосіб змусити його працювати так, як ви описуєте. Можуть бути кращі способи зробити це, але оскільки ви не опублікували свій код діяльності, мені доведеться імпровізувати і припустити, що у вас є такий список на початку вашої діяльності:
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;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void loadHistory(String query) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
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);
}
SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();
search.setSuggestionsAdapter(new ExampleAdapter(this, cursor, items));
}
}
Тепер вам потрібно створити адаптер, розширений з 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;
}
}
Кращий спосіб це зробити, якщо дані вашого списку надходять з бази даних, ви можете передавати функції, що Cursorповертаються базою даних, безпосередньо до ExampleAdapterта використовувати відповідний селектор стовпців для відображення тексту стовпця в TextViewпосиланні в адаптері.
Зверніть увагу: при імпорті CursorAdapterне імпортуйте версію підтримки Android, android.widget.CursorAdapterзамість цього імпортуйте стандарт .
Для адаптера також знадобиться власний макет:
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>
Тепер ви можете налаштувати елементи списку, додавши до макета додаткові подання тексту або зображення та заповнивши їх даними в адаптері.
Це має бути все, але якщо ви цього ще не зробили, вам потрібен пункт меню SearchView:
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>
Потім створіть конфігурацію для пошуку:
res / xml / searchchable.xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search"
android:hint="@string/search" >
</searchable>
Нарешті додайте це всередину відповідного тегу активності у файлі маніфесту:
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" />
Зверніть увагу: @string/searchрядок, використаний у прикладах, повинен бути визначений у values / strings.xml , також не забудьте оновити посилання на com.exampleваш проект.