Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

Android में SearchView का उपयोग करके सूची फ़िल्टर करना

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 का उपयोग करें
  1. एंड्रॉइड पर फ्लूबॉट मैलवेयर क्या है? एंड्रॉइड पर फ्लूबॉट मैलवेयर क्या है?

    एंड्रॉइड बहुत विकसित हुआ है, इतना कि यह अनिवार्य रूप से आउट-ऑफ-द-बॉक्स सुरक्षित है। लेकिन, ऑपरेटिंग सिस्टम की ऐप्स को साइडलोड करने की क्षमता के कारण, परिणाम विनाशकारी हो सकते हैं। फ्लूबॉट एक ऐसा बैंकिंग मैलवेयर है जो इस कार्यक्षमता का लाभ उठा रहा है। तो फ्लूबॉट क्या है? यह आपको कैसे प्रभावित कर सकता

  1. स्टॉक Android वास्तव में क्या है? स्टॉक Android वास्तव में क्या है?

    स्टॉक Android, जिसे वेनिला Android भी कहा जाता है, उपलब्ध Android ऑपरेटिंग सिस्टम का सबसे बुनियादी संस्करण है। स्टॉक Android डिवाइस Google द्वारा डिज़ाइन और विकसित किए गए Android के कोर कर्नेल को चलाते हैं। यह आमतौर पर कैरियर-इंस्टॉल प्रोग्राम की कमी से अलग होता है। उदाहरण के लिए, Verizon के नेटवर्

  1. Android System WebView समझाया गया: भूमिका, महत्व और अपडेट रखने का तरीका Android System WebView समझाया गया: भूमिका, महत्व और अपडेट रखने का तरीका

    आपने अपने Android डिवाइस की ऐप सूची में Android System WebView (ASW) देखा होगा या, कभी-कभी, Google Play Store अपडेट के रूप में। यह महत्वपूर्ण सिस्टम ऐप कुछ ऐसा नहीं है जिसे आप सीधे इंस्टॉल या उपयोग करते हैं, लेकिन यह Android ऑपरेटिंग सिस्टम का एक अनिवार्य हिस्सा बना हुआ है। आपके द्वारा इंस्टॉल किए ग