इसके लिए एक साथ समाधान करने में थोड़ा समय लगा, लेकिन यह पाया है कि यह उस तरीके से काम करने का सबसे आसान तरीका है जैसा आप वर्णन करते हैं। ऐसा करने के लिए बेहतर तरीके हो सकते हैं, लेकिन चूंकि आपने अपना गतिविधि कोड पोस्ट नहीं किया है, इसलिए मुझे आपकी गतिविधि की शुरुआत में इस तरह की एक सूची सुधारनी होगी और माननी होगी:
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
इसके बजाय मानक आयात करें ।
एडाप्टर को एक कस्टम लेआउट की भी आवश्यकता होगी:
रेस / लेआउट / 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 मेनू आइटम की आवश्यकता है:
रेस / मेनू / 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>
फिर खोज योग्य विन्यास बनाएँ:
रेस / xml / searchable.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
उदाहरणों में उपयोग की जाने वाली स्ट्रिंग को मान / स्ट्रिंग्स . xml में परिभाषित किया जाना चाहिए , com.example
अपनी परियोजना के संदर्भ को अपडेट करना भी न भूलें ।