Как реализовать Android SearchView на примере

Опубликовано: 10 Января, 2023

Виджет SearchView используется для предоставления пользователю интерфейса поиска, чтобы пользователь мог ввести свой поисковый запрос и отправить запрос поставщику поиска и получить список предложений или результатов запроса.

Синтаксис класса:

public class SearchView extends LinearLayout implements CollapsibleActionView

Иерархия классов:

java.lang.Object
  ↳  android.view.View
    ↳  android.view.ViewGroup
      ↳  android.widget.LinearLayout
        ↳  android.widget.SearchView

Пример демонстрации SearchView:

В этой статье вы создадите базовое приложение поиска с представлением поиска и представлением списка. Пользователь вводит поисковый запрос в поле поиска, которое присутствует на панели действий. Вот объясненные шаги:

Пошаговая реализация

Шаг 1. Создайте новый проект в Android Studio.

Чтобы создать новый проект в Android Studio, обратитесь к разделу «Как создать/запустить новый проект в Android Studio». Код для этого был предоставлен как на Java, так и на языке программирования Kotlin для Android.

Шаг 2: Работа с файлами XML

Далее переходим к файлу activity_main.xml , представляющему UI проекта. Он состоит из относительного макета с ListView, из которого нужно искать данные. Вот полный код для activity_main.xml:

XML




<?xml version="1.0" encoding="utf-8"?>
<!-- Relative Layout -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  
    <!-- List View from which data is to be searched -->
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="fill_parent" />
</RelativeLayout>

Создайте файл ресурсов menu.xml и добавьте SearchView в качестве элемента меню на панель действий с заголовком «Поиск».

Вот полный код файла menu.xml.

XML




<?xml version="1.0" encoding="utf-8"?>
  
    <!-- Search view widget as item in menu -->
    <item
        android:id="@+id/search_bar"
        android:title="Search"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="ifRoom|withText" />
</menu>

Шаг 3: Работа с файлом MainActivity

Перейдите в файл MainActivity и обратитесь к следующему коду. Ниже приведен код файла MainActivity. Комментарии добавляются внутри кода, чтобы понять код более подробно. В этом файле элементы добавляются в представление списка вручную, а setOnQueryTextListener прикрепляется к представлению поиска. Метод onQueryTextSubmit() переопределен, в котором представление списка фильтруется в соответствии с поисковым запросом, введенным пользователем.

Java




import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
import java.util.ArrayList;
  
public class MainActivity extends AppCompatActivity {
  
    // List View object
    ListView listView;
  
    // Define array adapter for ListView
    ArrayAdapter<String> adapter;
  
    // Define array List for List View data
    ArrayList<String> mylist;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // initialise ListView with id
        listView = findViewById(R.id.listView);
  
        // Add items to Array List
        mylist = new ArrayList<>();
        mylist.add("C");
        mylist.add("C++");
        mylist.add("C#");
        mylist.add("Java");
        mylist.add("Advanced java");
        mylist.add("Interview prep with c++");
        mylist.add("Interview prep with java");
        mylist.add("data structures with c");
        mylist.add("data structures with java");
  
        // Set adapter to ListView
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mylist);
        listView.setAdapter(adapter);
    }
  
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate menu with items using MenuInflator
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
  
        // Initialise menu item search bar
        // with id and take its object
        MenuItem searchViewItem = menu.findItem(R.id.search_bar);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchViewItem);
  
        // attach setOnQueryTextListener
        // to search view defined above
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            // Override onQueryTextSubmit method which is call when submit query is searched
            @Override
            public boolean onQueryTextSubmit(String query) {
                // If the list contains the search query than filter the adapter
                // using the filter method with the query as its argument
                if (list.contains(query)) {
                    adapter.getFilter().filter(query);
                } else {
                    // Search query not found in List View
                    Toast.makeText(MainActivity.this, "Not found", Toast.LENGTH_LONG).show();
                }
                return false;
            }
  
            // This method is overridden to filter the adapter according
            // to a search query when the user is typing search
            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
}

Kotlin




import android.os.Bundle
import android.support.v4.view.MenuItemCompat
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.SearchView
import android.widget.Toast
  
class MainActivity : AppCompatActivity() {
  
    // List View object
    lateinit var listView: ListView
  
    // Define array adapter for ListView
    lateinit var adapter: ArrayAdapter<String>
  
    // Define array List for List View data
    lateinit var mylist: ArrayList<String>
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // initialise ListView with id
        listView = findViewById(R.id.listView) as ListView
  
        // Add items to Array List
        mylist = ArrayList()
        mylist.add("C")
        mylist.add("C++")
        mylist.add("C#")
        mylist.add("Java")
        mylist.add("Advanced java")
        mylist.add("Interview prep with c++")
        mylist.add("Interview prep with java")
        mylist.add("data structures with c")
        mylist.add("data structures with java")
  
        // Set adapter to ListView
        adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mylist)
        listView.adapter = adapter
    }
  
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate menu with items using MenuInflator
        val inflater = menuInflater
        inflater.inflate(R.menu.menu, menu)
  
        // Initialise menu item search bar
        // with id and take its object
        val searchViewItem = menu.findItem(R.id.search_bar)
        val searchView = MenuItemCompat.getActionView(searchViewItem) as SearchView
  
        // attach setOnQueryTextListener
        // to search view defined above
        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            // Override onQueryTextSubmit method which is call when submit query is searched
            override fun onQueryTextSubmit(query: String): Boolean {
                // If the list contains the search query than filter the adapter
                // using the filter method with the query as its argument
                if (mylist.contains(query)) {
                    adapter.filter.filter(query)
                } else {
                    // Search query not found in List View
                    Toast.makeText(this@MainActivity, "Not found", Toast.LENGTH_LONG).show()
                }
                return false
            }
  
            // This method is overridden to filter the adapter according
            // to a search query when the user is typing search
            override fun onQueryTextChange(newText: String): Boolean {
                adapter.filter.filter(newText)
                return false
            }
        })
        return super.onCreateOptionsMenu(menu)
    }
}

Выход: