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, Cursor
veritabanı işlevleri tarafından döndürülenleri doğrudan bağdaştırıcıda referans ExampleAdapter
verilen sütun metnini görüntülemek için ilgili sütun seçiciyi kullanabilirsiniz TextView
.
Lütfen unutmayın: içe CursorAdapter
aktarırken Android destek sürümünü içe aktarmayın, android.widget.CursorAdapter
bunun 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.example
projeniz için referansı güncellemeyi unutmayın .