एंड्रॉइड में SearchView के साथ लिस्ट फिल्टरिंग
यह ट्यूटोरियल SearchView को ListView और ArrayAdapter के साथ इंटीग्रेट करके रियल-टाइम फिल्टरिंग लागू करने का तरीका दिखाता है।
लेआउट (activity_main.xml)
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:iconifiedByDefault="false"
android:queryHint="यहां खोजें..." />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/searchView"
android:layout_marginTop="8dp"
android:divider="#E0E0E0"
android:dividerHeight="1dp" />
</RelativeLayout>
MainActivity.java
import android.os.Bundle;
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 SearchView searchView;
private ListView listView;
private ArrayAdapter adapter;
private List fruitList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchView = findViewById(R.id.searchView);
listView = findViewById(R.id.listView);
// सैंपल डेटा
fruitList = new ArrayList<>(Arrays.asList(
"सेब", "केला", "अनानास", "संतरा", "आम",
"अंगूर", "नींबू", "खरबूजा", "तरबूज", "पपीता",
"स्ट्रॉबेरी", "ब्लूबेरी", "रास्पबेरी", "कीवी", "अनार"
));
// ArrayAdapter सेटअप
adapter = new ArrayAdapter<>(
this,
android.R.layout.simple_list_item_1,
fruitList
);
listView.setAdapter(adapter);
// SearchView लिस्टनर
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// एंटर/सबमिट दबाने पर
if (!adapter.getFilter().filter(query)) {
Toast.makeText(MainActivity.this, "कोई मिलान नहीं: " + query, Toast.LENGTH_SHORT).show();
}
searchView.clearFocus();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// रियल-टाइम फिल्टरिंग (हर कीस्ट्रोक पर)
adapter.getFilter().filter(newText);
return true;
}
});
// वैकल्पिक: फोकस बदलाव पर कीबोर्ड छुपाएं
searchView.setOnQueryTextFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
hideKeyboard();
}
});
// आइटम क्लिक लिस्टनर
listView.setOnItemClickListener((parent, view, position, id) -> {
String selected = adapter.getItem(position);
Toast.makeText(this, "चुना गया: " + selected, Toast.LENGTH_SHORT).show();
});
}
private void hideKeyboard() {
android.view.inputmethod.InputMethodManager imm =
(android.view.inputmethod.InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
}
}
}
कस्टम फिल्टरिंग (कस्टम ऑब्जेक्ट्स के लिए)
public class Fruit {
String name;
String category;
// कंस्ट्रक्टर, गेटर्स...
}
// कस्टम एडॉप्टर में Filterable इम्प्लीमेंट करें
public class FruitAdapter extends ArrayAdapter implements Filterable {
private List originalList;
private List filteredList;
private FruitFilter filter;
@Override
public Filter getFilter() {
if (filter == null) filter = new FruitFilter();
return filter;
}
private class FruitFilter 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<>();
String query = constraint.toString().toLowerCase();
for (Fruit fruit : originalList) {
if (fruit.getName().toLowerCase().contains(query) ||
fruit.getCategory().toLowerCase().contains(query)) {
filtered.add(fruit);
}
}
results.values = filtered;
results.count = filtered.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredList = (List) results.values;
notifyDataSetChanged();
}
}
}
SearchView कस्टमाइज़ेशन
// सर्च आइकन बदलें
searchView.setIconifiedByDefault(false); // हमेशा एक्सपैंडेड
searchView.setSubmitButtonEnabled(true); // सबमिट बटन दिखाएं
// टेक्स्ट कलर
int searchTextId = searchView.getContext().getResources()
.getIdentifier("android:id/search_src_text", null, null);
TextView searchText = searchView.findViewById(searchTextId);
searchText.setTextColor(Color.BLACK);
searchText.setHintTextColor(Color.GRAY);
// बैकग्राउंड
int plateId = searchView.getContext().getResources()
.getIdentifier("android:id/search_plate", null, null);
View plate = searchView.findViewById(plateId);
plate.setBackgroundResource(R.drawable.search_bg);
मॉडर्न: RecyclerView + SearchView
// RecyclerView एडॉप्टर में
adapter.getFilter().filter(query);
// या Kotlin एक्सटेंशन के साथ
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextChange(newText: String) = adapter.filter(newText).also { true }
override fun onQueryTextSubmit(query: String) = true
})
बेस्ट प्रैक्टिसेज
- बड़े डेटासेट के लिए
Filterableइम्प्लीमेंट करें - डिबाउंसिंग जोड़ें (RxJava/Kotlin Flow) अत्यधिक फिल्टरिंग से बचने के लिए
- खाली स्टेट UI दिखाएं जब कोई परिणाम न हो
- हाल की खोजों को सेव करें (SharedPreferences/Room)
- एक्सेसिबिलिटी: कंटेंट डिस्क्रिप्शन और लेबल प्रदान करें