Как реализовать 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.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) } } |