SearchView क्या है?
SearchView एक UI कंपोनेंट है जो उपयोगकर्ताओं को एक सूची या डेटा सेट के भीतर खोज करने की अनुमति देता है। यह एक्शन बार/टूलबार में या लेआउट में स्टैंडअलोन विजेट के रूप में उपयोग किया जा सकता है।
SearchView के मुख्य लिस्टनर्स
- OnQueryTextListener - टेक्स्ट परिवर्तन सुनता है
onQueryTextSubmit(query)- जब उपयोगकर्ता एंटर/सबमिट दबाता हैonQueryTextChange(newText)- जब टेक्स्ट बदलता है (रियल-टाइम फ़िल्टरिंग के लिए)
- OnCloseListener - जब खोज बंद होती है
- OnSuggestionListener - सुझावों पर क्लिक के लिए
उदाहरण: ListView के साथ SearchView
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<androidx.appcompat.widget.SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:queryHint="खोजें..."
android:iconifiedByDefault="false" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="8dp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private SearchView searchView;
private ArrayAdapter adapter;
private List originalData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
searchView = findViewById(R.id.searchView);
// सैंपल डेटा
originalData = new ArrayList<>(Arrays.asList(
"Java", "Android", "Kotlin", "C Language", "C++", "Python",
"Go Language", "JavaScript", "TypeScript", "Swift", "Dart", "Flutter"
));
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, originalData);
listView.setAdapter(adapter);
// SearchView कॉन्फ़िगरेशन
searchView.setIconifiedByDefault(false); // हमेशा विस्तारित
searchView.setQueryHint("भाषा खोजें...");
searchView.clearFocus(); // कीबोर्ड ऑटो-शो रोकें
// रियल-टाइम फ़िल्टरिंग
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchView.clearFocus();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
});
// आइटम क्लिक लिस्टनर
listView.setOnItemClickListener((parent, view, position, id) -> {
String item = adapter.getItem(position);
Toast.makeText(this, "चुना गया: " + item, Toast.LENGTH_SHORT).show();
});
}
}
उन्नत: कस्टम एडाप्टर के साथ फ़िल्टरिंग
कस्टम ऑब्जेक्ट्स के लिए, अपने एडाप्टर में Filterable इंप्लीमेंट करें:
public class CustomAdapter extends BaseAdapter implements Filterable {
private List- originalList, filteredList;
private ItemFilter filter = new ItemFilter();
@Override
public Filter getFilter() { return filter; }
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
results.values = originalList;
results.count = originalList.size();
} else {
List
- filtered = new ArrayList<>();
for (Item item : originalList) {
if (item.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
filtered.add(item);
}
}
results.values = filtered;
results.count = filtered.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredList = (List
- ) results.values;
notifyDataSetChanged();
}
}
}
टूलबार/एक्शन बार में SearchView
// menu/search_menu.xml
<menu xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:title="खोजें"
android:icon="@drawable/ic_search"
app:showAsAction="always|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>
// Activity में
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
// कॉन्फ़िगर करें...
return true;
}
सर्वोत्तम अभ्यास
- बड़े डेटासेट के लिए
RecyclerView+DiffUtilका उपयोग करें - डिबाउंसिंग के लिए RxJava/Kotlin Flow के साथ
debounce()ऑपरेटर उपयोग करें - खोज इतिहास सहेजने के लिए
SearchRecentSuggestionsProviderका उपयोग करें