爲了解決這個問題,我們花了一段時間才找到解決方案,但發現這是最簡單的方式讓它按照您描述的方式工作。有可能是更好的方式來做到這一點,但因爲你還沒有發佈你的活動代碼,我將不得不即興發揮,並假設你在你活動的開始有這樣的名單:
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);replaced s with i as s not used anywhere.
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));
}
}
現在,你需要創建一個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 /佈局/ 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>
現在,您可以通過添加額外的文本或圖像視圖佈局定製列表項和用適配器中的數據填充它們。
這應該是所有的,但如果你還沒有這樣做了,你需要一個搜索查看菜單項:
RES /菜單/的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 /可搜索。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
項目。
您應該儘可能詳細地發佈您嘗試過的所有內容。使用示例代碼的具體問題往往會得到更快,更有意義的答案。 –
@matteo可以分享代碼 – Erum
查看用戶的答案 – Matteo