Today we will look into Android SearchView widget and develop an application that filters a ListView by the queried text. We’ll be using DataBinding to hook up the layouts in the Activities and Adapters. If you haven’t read about DataBinding refer this tutorial first for a better understanding.

今天,我们将研究Android SearchView小部件,并开发一个应用程序,该应用程序可通过查询的文本过滤ListView。 我们将使用DataBinding来连接“活动”和“适配器”中的布局。 如果您还没有阅读有关DataBinding的信息,请先参考本教程以获取更好的理解。

Android SearchView (Android SearchView)

Android allows us to use the search functionality in our app by displaying the SearchView widget either in the ToolBar/ActionBar or inserting it into a layout. Android SearchView widget is available from Android 3.0 onwards.

Android通过在ToolBar / ActionBar中显示SearchView小部件或将其插入到布局中来允许我们在应用中使用搜索功能。 从Android 3.0开始可以使用Android SearchView小部件。

The SearchView is defined in the XML layout as shown below.

SearchView在XML布局中定义,如下所示。

<android.support.v7.widget.SearchViewandroid:id="@+id/search"android:layout_width="match_parent"android:layout_height="wrap_content" />

There are many forms for searching in Android such as voice search, suggestions etc. In this tutorial we’ll use SearchView.OnQueryTextListener and Filterable interfaces.

Android中有多种搜索形式,例如语音搜索,建议等。在本教程中,我们将使用SearchView.OnQueryTextListenerFilterable接口。

The Filterable interface filters the queried text over a ListView and displays the resulted ListView rows.

Filterable接口过滤ListView上查询的文本,并显示结果ListView行。

OnQueryTextListener interface can detect two events.

OnQueryTextListener接口可以检测两个事件。

  1. onQueryTextChange is called when the user types each character in the text field当用户在文本字段中键入每个字符时,将调用onQueryTextChange
  2. onQueryTextSubmit is triggered when the search is pressed按下搜索时会触发onQueryTextSubmit

Android SearchView示例 (Android SearchView Example)

Below image shows the final android SearchView example project.

下图显示了最终的Android SearchView示例项目。

The project consists of an Activity and an Adapter for the ListView.

该项目由一个Activity和一个用于ListView的适配器组成。

Android SearchView示例代码 (Android SearchView Example Code)

The activity_main.xml is given below. It consists of a ListView with a SearchView on top.

下面给出activity_main.xml。 它由一个ListView和一个顶部SearchView组成。

activity_main.xml

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="https://schemas.android.com/apk/res/android"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><android.support.v7.widget.SearchViewandroid:id="@+id/search"android:layout_width="match_parent"android:layout_height="wrap_content"android:clickable="true" /><ListViewandroid:id="@+id/list_view"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_below="@+id/search" /></RelativeLayout></layout>

The MainActivity.java is given below.

MainActivity.java在下面给出。

package com.journaldev.searchview;import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.SearchView;import com.journaldev.searchview.databinding.ActivityMainBinding;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {ActivityMainBinding activityMainBinding;ListAdapter adapter;List<String> arrayList= new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);arrayList.add("January");arrayList.add("February");arrayList.add("March");arrayList.add("April");arrayList.add("May");arrayList.add("June");arrayList.add("July");arrayList.add("August");arrayList.add("September");arrayList.add("October");arrayList.add("November");arrayList.add("December");adapter= new ListAdapter(arrayList);activityMainBinding.listView.setAdapter(adapter);activityMainBinding.search.setActivated(true);activityMainBinding.search.setQueryHint("Type your keyword here");activityMainBinding.search.onActionViewExpanded();activityMainBinding.search.setIconified(false);activityMainBinding.search.clearFocus();activityMainBinding.search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) {return false;}@Overridepublic boolean onQueryTextChange(String newText) {adapter.getFilter().filter(newText);return false;}});}
}

In the above code, we are passing an ArrayList of Months to the List Adapter.

在上面的代码中,我们将一个月的ArrayList传递给列表适配器。

We’re invoking the filter method that’s defined in the adapter class every time the search query text changes.

每次搜索查询文本更改时,我们都会调用适配器类中定义的filter方法。

The ListAdapter.java class looks like this.

ListAdapter.java类如下所示。

package com.journaldev.searchview;import android.content.Context;
import android.databinding.DataBindingUtil;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import com.journaldev.searchview.databinding.RowItemBinding;
import java.util.ArrayList;
import java.util.List;public class ListAdapter extends BaseAdapter implements Filterable {List<String> mData;List<String> mStringFilterList;ValueFilter valueFilter;private LayoutInflater inflater;public ListAdapter(List<String> cancel_type) {mData=cancel_type;mStringFilterList = cancel_type;}@Overridepublic int getCount() {return mData.size();}@Overridepublic String getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, final ViewGroup parent) {if (inflater == null) {inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);}RowItemBinding rowItemBinding = DataBindingUtil.inflate(inflater, R.layout.row_item, parent, false);rowItemBinding.stringName.setText(mData.get(position));return rowItemBinding.getRoot();}@Overridepublic Filter getFilter() {if (valueFilter == null) {valueFilter = new ValueFilter();}return valueFilter;}private class ValueFilter extends Filter {@Overrideprotected FilterResults performFiltering(CharSequence constraint) {FilterResults results = new FilterResults();if (constraint != null && constraint.length() > 0) {List<String> filterList = new ArrayList<>();for (int i = 0; i < mStringFilterList.size(); i++) {if ((mStringFilterList.get(i).toUpperCase()).contains(constraint.toString().toUpperCase())) {filterList.add(mStringFilterList.get(i));}}results.count = filterList.size();results.values = filterList;} else {results.count = mStringFilterList.size();results.values = mStringFilterList;}return results;}@Overrideprotected void publishResults(CharSequence constraint,FilterResults results) {mData = (List<String>) results.values;notifyDataSetChanged();}}}

As you can see in the above code we’re performing filtering using an inner class ValueFilter that extends the Filter class. It filters the list by checking if the search query text matches the strings given in the ArrayList.

如您在上面的代码中看到的,我们正在使用扩展了Filter类的内部类ValueFilter执行过滤。 它通过检查搜索查询文本是否与ArrayList中给定的字符串匹配来过滤列表。

The XML layout for the ListView row is given below.

下面给出了ListView行的XML布局。

row_item.xml

row_item.xml

<layout xmlns:android="https://schemas.android.com/apk/res/android"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/stringName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_centerVertical="true"android:padding="@dimen/activity_horizontal_margin"android:textAllCaps="false"android:textAppearance="?android:attr/textAppearanceMedium" /></RelativeLayout></layout>

The output of the android search view application in action is given below.

运行中的android search view应用程序的输出如下。

The SearchView shown above requires us to press the search icon to activate the text field. Also, it doesn’t contain any hint/placeholder text.

上面显示的SearchView要求我们按搜索图标以激活文本字段。 另外,它不包含任何提示/占位符文本。

Add the following code in the MainActivity to enable the SearchView by default and display a hint.

在MainActivity中添加以下代码以默认启用SearchView并显示提示。

activityMainBinding.search.setActivated(true);activityMainBinding.search.setQueryHint("Type your keyword here");activityMainBinding.search.onActionViewExpanded();activityMainBinding.search.setIconified(false);activityMainBinding.search.clearFocus();

The SearchView after customising as above looks like this.

如上自定义后的SearchView如下所示。

This brings an end to android SearchView tutorial. We’ll dive into the advanced features of SearchView in a later tutorial. You can download the Android SearchView Project from the link given below.

这就结束了Android SearchView教程。 在后面的教程中,我们将深入探讨SearchView的高级功能。 您可以从下面提供的链接下载Android SearchView项目

Download Android SearchView Example Project下载Android SearchView示例项目

翻译自: https://www.journaldev.com/12478/android-searchview-example-tutorial

使用DataBinding的Android SearchView示例教程相关推荐

  1. Android WebView示例教程

    Android WebView is used to display HTML in an android app. We can use android WebView to load HTML p ...

  2. Android ExpandableListView示例教程

    Welcome to Android ExpandableListView Example Tutorial. In this tutorial we'll implement an Expandab ...

  3. Android ListView示例教程

    We will learn how to create a simple Android ListView and launch a new activity on selecting a singl ...

  4. Android ActionBar示例教程

    Today we will look into Android ActionBar. Action Bar is one of the important part of any applicatio ...

  5. Android ViewPager示例教程

    ViewPager in Android allows the user to flip left and right through pages of data. In our android Vi ...

  6. Android AsyncTask示例教程

    Today we will look into Android AsyncTask. We will develop an Android example application that perfo ...

  7. Android BroadcastReceiver示例教程

    Today we'll discuss and implement Android BroadcastReceiver that is a very important component of An ...

  8. Jetpack之DataBinding,android蓝牙开发教程

    DataBinding在xml中数据绑定支持的语法表达式也是非常丰富的,支付在布局文件中使用一下运算符.表达式和关键字: 算术运算符:+ - * / %: 字符串连接运算符:+: 逻辑运算符:& ...

  9. android jni示例_Android动画示例

    android jni示例 Android Animation is used to give the UI a rich look and feel. Animations in android a ...

最新文章

  1. Guice系列之用户指南(五)
  2. mysql accountlevel1_mysql---修改表结构
  3. php 合并 字符串_PHP如何去重合并字符串
  4. c语言键盘控制数码管显示,3*4矩阵键盘控制4位数码管显示的C程序
  5. java中定义一个栈容器_Java 容器之 Connection栈队列及一些常用
  6. 通向财务自由之路08_入市或市场时机选择
  7. 3年了,才这点工资,打死我都不相信
  8. 内联元素转化为内联块元素的一些小细节
  9. C#教程第四课:循环控制语句
  10. Failed to build Android - icescreem-4.0.4
  11. Maxcompute ODPS SQL 日期函数
  12. 俄罗斯地名 中文 英文 俄文
  13. python计算iv值_python计算IV值
  14. SMOTE算法(处理非平衡数据)
  15. Android检测手机是否安装app
  16. 符号“∑”和“Π”的用法
  17. 交换机有哪几种端口类型
  18. 几行代码爬取喜马拉雅音乐
  19. JavaScript原型是什么
  20. c语言余弦定理float,余弦相似度公式

热门文章

  1. Unable to find the requested .Net Framework Data Provider
  2. 文件共享服务器的搭建及调试——SAMBA
  3. [转载] python 中的时间,日期,时间戳互相转换
  4. [转载] 【C/C++】Vector的创建与初始化方法
  5. [转载] Numpy数组对象ndarray
  6. 机器学习-数据科学库-day6
  7. hdu1113 Word Amalgamation(详解--map和string的运用)
  8. 约瑟夫问题的数学方法
  9. ROS+Gazebo仿真差速小车并实现控制
  10. Reading Excel with Python