Как реализовать Android SearchView на примере
Виджет 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 --> 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.Bundleimport android.support.v4.view.MenuItemCompatimport android.support.v7.app.AppCompatActivityimport android.view.Menuimport android.widget.ArrayAdapterimport android.widget.ListViewimport android.widget.SearchViewimport 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) }} |