Bunun için bir çözüm bulmak biraz zaman aldı, ancak bunun tarif ettiğiniz şekilde çalışmasını sağlamanın en kolay yolu olduğunu anladım. Bunu yapmanın daha iyi yolları olabilir, ancak etkinlik kodunuzu göndermediğiniz için doğaçlama yapmam ve etkinliğinizin başında buna benzer bir listenizin olduğunu varsaymam gerekecek:
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));
}
}
Şimdi aşağıdakilerden genişletilmiş bir adaptör oluşturmanız gerekir 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;
}
}
Bunu yapmanın daha iyi bir yolu, liste verileriniz bir veritabanından geliyorsa, Cursorveritabanı işlevleri tarafından döndürülenleri doğrudan bağdaştırıcıda referans ExampleAdapterverilen sütun metnini görüntülemek için ilgili sütun seçiciyi kullanabilirsiniz TextView.
Lütfen unutmayın: içe CursorAdapteraktarırken Android destek sürümünü içe aktarmayın, android.widget.CursorAdapterbunun yerine standardı içe aktarın .
Adaptör ayrıca özel bir düzen gerektirecektir:
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>
Artık düzene ek metin veya resim görünümleri ekleyerek ve bunları adaptördeki verilerle doldurarak liste öğelerini özelleştirebilirsiniz.
Hepsi bu olmalı, ancak bunu daha önce yapmadıysanız, bir SearchView menü öğesine ihtiyacınız vardır:
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>
Ardından aranabilir bir yapılandırma oluşturun:
res / xml / aranabilir.xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search"
android:hint="@string/search" >
</searchable>
Son olarak, bunu manifest dosyasındaki ilgili etkinlik etiketine ekleyin:
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" />
Lütfen dikkat: @string/searchÖrneklerde kullanılan dizge değerler / strings.xml'de tanımlanmalıdır , ayrıca com.exampleprojeniz için referansı güncellemeyi unutmayın .