版权声明:本文为xing_star原创文章,转载请注明出处!

本文同步自http://javaexception.com/archives/82

背景:

做了很多年的app开发,貌似没见过没有搜索功能的,搜索这个功能还真是挺常见的,一般包括本地搜索,比如笔记类的,有道云笔记,或者Leanote,或者是qq,微信这样的IM软件,搜索本地聊天数据。也有一些是根据关键字,发起http请求,让服务端搜索。在本文主要关注的是本地搜索,比如搜索数据库中的内容,或者是其他本地存储的内容。

通常会觉得写搜索页面,比较麻烦,至少我是这么觉得的,关于RecyclerView跟SearchView准备多写几篇,这篇就讲最基础的使用方式,下篇会讲在SearchView在Toolbar中的场景,也就是点击搜索按钮,进入搜索页面自动展开搜索栏。

解决方案:

xml布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9.  
  10. <LinearLayout
  11. android:orientation="vertical"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content">
  14.  
  15. <android.support.v7.widget.SearchView
  16. android:id="@+id/search_view"
  17. android:layout_width="match_parent"
  18. app:queryHint="搜索"
  19. android:layout_height="wrap_content" />
  20.  
  21. <View
  22. android:layout_width="match_parent"
  23. android:background="#dddddd"
  24. android:layout_height="1px"/>
  25. </LinearLayout>
  26.  
  27. <android.support.v7.widget.RecyclerView
  28. android:id="@+id/recycler_view"
  29. android:layout_marginTop="2dp"
  30. android:layout_width="match_parent"
  31. android:layout_height="wrap_content" />
  32.  
  33. </LinearLayout>

RecyclerView设置的Adapter类

  1. class Adapter extends RecyclerView.Adapter {
  2. private List<String> datas = new ArrayList<>();
  3.  
  4. public void setDatas(List<String> datas) {
  5. this.datas = datas;
  6. }
  7.  
  8. @NonNull
  9. @Override
  10. public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  11. View view = LayoutInflater.from(viewGroup.getContext()).inflate(android.R.layout.simple_list_item_1, viewGroup, false);
  12. return new ViewHolder(view);
  13. }
  14.  
  15. @Override
  16. public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
  17. ViewHolder holder = (ViewHolder) viewHolder;
  18. holder.textView.setText(datas.get(position));
  19. }
  20.  
  21. @Override
  22. public int getItemCount() {
  23. return datas.size();
  24. }
  25. }
  26.  
  27. class ViewHolder extends RecyclerView.ViewHolder {
  28. TextView textView;
  29.  
  30. public ViewHolder(@NonNull View itemView) {
  31. super(itemView);
  32. textView = itemView.findViewById(android.R.id.text1);
  33. }
  34. }

RecyclerView item的布局文件用的是Android系统提供的一个比较简单的布局,android.R.layout.simple_list_item_1。

对SearchView设置监听事件

  1. searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  2. @Override
  3. public boolean onQueryTextSubmit(String query) {
  4. return false;
  5. }
  6.  
  7. @Override
  8. public boolean onQueryTextChange(String newText) {
  9. if (TextUtils.isEmpty(newText)) {
  10. adapter.setDatas(datas);
  11. adapter.notifyDataSetChanged();
  12. } else {
  13. adapter.setDatas(search(newText));
  14. adapter.notifyDataSetChanged();
  15. }
  16. return false;
  17. }
  18. });

由于是本地搜索,希望的效果是可以实时搜索,每输入一个字符,就重新搜索一次,于是将搜索事件放到了onQueryTextChange()方法中,如果不希望实时搜索,可以将过滤数据源的逻辑放到onQueryTextSubmit()方法中,当软键盘弹起的时候,我们会看到软键盘上右下角是一个搜索的按钮。点击此按钮就会触发一次搜索。

完整的java代码如下:

  1. public class MainActivity extends AppCompatActivity {
  2. private static final String TAG = "MainActivity";
  3.  
  4. private SearchView searchView;
  5. private RecyclerView recyclerView;
  6. private Adapter adapter;
  7. private List<String> datas;
  8.  
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. searchView = findViewById(R.id.search_view);
  14. recyclerView = findViewById(R.id.recycler_view);
  15. adapter = new Adapter();
  16. datas = generateDatas();
  17. adapter.setDatas(datas);
  18. recyclerView.setLayoutManager(new LinearLayoutManager(this));
  19. recyclerView.setAdapter(adapter);
  20. searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  21. @Override
  22. public boolean onQueryTextSubmit(String query) {
  23. return false;
  24. }
  25.  
  26. @Override
  27. public boolean onQueryTextChange(String newText) {
  28. if (TextUtils.isEmpty(newText)) {
  29. adapter.setDatas(datas);
  30. adapter.notifyDataSetChanged();
  31. } else {
  32. adapter.setDatas(search(newText));
  33. adapter.notifyDataSetChanged();
  34. }
  35. return false;
  36. }
  37. });
  38. }
  39.  
  40. private List<String> search(String query) {
  41. List<String> filterDatas = new ArrayList<>();
  42. for (String source : datas) {
  43. if (source.contains(query)) {
  44. filterDatas.add(source);
  45. }
  46. }
  47. return filterDatas;
  48. }
  49.  
  50. private List<String> generateDatas() {
  51. List<String> list = new ArrayList<>();
  52. for (int index = 0; index < 10; index++) {
  53. list.add("Hello World " + (index + 1));
  54. }
  55. return list;
  56. }
  57.  
  58. class Adapter extends RecyclerView.Adapter {
  59. private List<String> datas = new ArrayList<>();
  60.  
  61. public void setDatas(List<String> datas) {
  62. this.datas = datas;
  63. }
  64.  
  65. @NonNull
  66. @Override
  67. public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  68. View view = LayoutInflater.from(viewGroup.getContext()).inflate(android.R.layout.simple_list_item_1, viewGroup, false);
  69. return new ViewHolder(view);
  70. }
  71.  
  72. @Override
  73. public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
  74. ViewHolder holder = (ViewHolder) viewHolder;
  75. holder.textView.setText(datas.get(position));
  76. }
  77.  
  78. @Override
  79. public int getItemCount() {
  80. return datas.size();
  81. }
  82. }
  83.  
  84. class ViewHolder extends RecyclerView.ViewHolder {
  85. TextView textView;
  86.  
  87. public ViewHolder(@NonNull View itemView) {
  88. super(itemView);
  89. textView = itemView.findViewById(android.R.id.text1);
  90. }
  91. }
  92. }

下载地址:

链接:https://pan.baidu.com/s/1HcSUpfLBcWuXyHJ7vOtCxg 密码:89sa

  1.  

Android RecyclerView SearchView基本用法1的更多相关文章

  1. Android RecyclerView Adapter 新式用法之SortedListAdapterCallback

    引言 前几天在同事的提醒下发现V7中有了一个新的工具类SortedListAdapterCallback,配合RecyclerView Adapter和SortedList一起使用更加方便的管理我们在 ...

  2. Android控件RecyclerView的基本用法

    Android控件RecyclerView的基本用法 转 https://www.jianshu.com/p/e71a4b73098f   github: https://github.com/Cym ...

  3. Android的搜索框SearchView的用法-android学习之旅(三十九)

    SearchView简介 SearchView是搜索框组件,他可以让用户搜索文字,然后显示.' 代码示例 这个示例加了衣蛾ListView用于为SearchView增加自动补全的功能. package ...

  4. Android RecyclerView的基本使用

    Android RecyclerView 在去年的Google I/O大会上就推出来了,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewG ...

  5. [Android]RecyclerView的简单演示样例

    去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...

  6. (转载) Android RecyclerView 使用完全解析 体验艺术般的控件

    Android RecyclerView 使用完全解析 体验艺术般的控件 标签: Recyclerviewpager瀑布流 2015-04-16 09:07 721474人阅读 评论(458) 收藏  ...

  7. Android RecyclerView 实现支付宝首页效果

    Android RecyclerView 实现支付宝首页效果 [TOC] 虽然我本人不喜欢支付宝的,但是这个网格本身其实还是不错的,项目更新中更改了一个布局为网格模式,类似支付宝.(估计是产品抄袭的= ...

  8. android的logcat详细用法

    Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...

  9. Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

     Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...

随机推荐

  1. Apache + WordPress 从 0 搭建

    引言 又到周末了,周末小编一般不更新系列文章,原因嘛是因为要攒稿子,年底工作比较忙,不攒点稿子是要断更的:( 所以周末一般聊点简单轻松加愉快的东西,小编现在的博客站是由 HEXO 进行搭建的,最近随着 ...

  2. POJ 1325 Machine schedine (二分图-最小点覆盖数=最大匹配边数)

    As we all know, machine scheduling is a very classical problem in computer science and has been stud ...

  3. ARTS-S sed替换

    网上有大量替换的例子,比如 sed 's/aaa/bbb/g' a.txt 其实分隔符可以用别的字符,比如#,所以下面的命令也是正确的 sed 's#aaa#bbb#g' a.txt 用#号在用环境变 ...

  4. 深入理解 Java 方法

    方法(有的人喜欢叫函数)是一段可重用的代码段.

  5. PostgreSQL 、springboot 、spring data jpa 集成

    项目地址:https://gitee.com/zhxs_code/PostgreSQL_springboot_jpa_demo.git 增删查改都已经实现. 重点部分: 1.定义自己的方言. pack ...

  6. 阿里云https证书Apache配置

    最近玩小程序,只支持https协议,于是给网站添加https支持.手上没钱,自己生成的证书不受信任,找到了阿里云的免费证书(PS:证书可以用在其他云主机上,不一定是阿里云的主机).如何购买下载不多说, ...

  7. EFK的搭建(未完成)

    EFK 是ELK 日志分析的一个变种,能够更好的来实现日志分析. 首先我们先准备3台 centos7的服务器,在给他们调成2核2G的状态打开. 软件 版本号 zookeeper 3.4.14 Kafk ...

  8. 《Java基础知识》Java抽象类,接口的概念和使用

    1.抽象类 在自上而下的继承层次结构中,位于上层的类更具有通用性,甚至可能更加抽象.从某种角度看,祖先类更加通用,它只包含一些最基本的成员,人们只将它作为派生其他类的基类,而不会用来创建对象.甚至,你 ...

  9. Rancher 2.3实现K8S一键式升级!再也不用同步升级Rancher啦!

    在Rancher 2.3之前,Rancher的新版本总是随着Kubernetes的新版本一起发布,如果你想要使用最新版本的Kubernetes,那么你需要先升级Rancher才能使用.Rancher ...

  10. .net(C#数据库访问) Mysql,Sql server,Sqlite,Access四种数据库的连接方式

    便签记录Mysql,Sql server,Sqlite,Access四种数据库的简单连接方式 //using MySql.Data.MySqlClient; #region 执行简单SQL语句,使用M ...