Android RecyclerView SearchView基本用法1
程序员文章站
2023-01-28 17:34:56
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/82 背景: 做了很多年的app开发,貌似没见过没有搜索功能的,搜索这个功能还真是挺常见的,一般包括本地搜索,比如笔记类的,有道云笔记,或者Leanote,或者 ......
版权声明:本文为xing_star原创文章,转载请注明出处!
本文同步自
背景:
做了很多年的app开发,貌似没见过没有搜索功能的,搜索这个功能还真是挺常见的,一般包括本地搜索,比如笔记类的,有道云笔记,或者leanote,或者是qq,微信这样的im软件,搜索本地聊天数据。也有一些是根据关键字,发起http请求,让服务端搜索。在本文主要关注的是本地搜索,比如搜索数据库中的内容,或者是其他本地存储的内容。
通常会觉得写搜索页面,比较麻烦,至少我是这么觉得的,关于recyclerview跟searchview准备多写几篇,这篇就讲最基础的使用方式,下篇会讲在searchview在toolbar中的场景,也就是点击搜索按钮,进入搜索页面自动展开搜索栏。
解决方案:
xml布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> <linearlayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.searchview android:id="@+id/search_view" android:layout_width="match_parent" app:queryhint="搜索" android:layout_height="wrap_content" /> <view android:layout_width="match_parent" android:background="#dddddd" android:layout_height="1px"/> </linearlayout> <android.support.v7.widget.recyclerview android:id="@+id/recycler_view" android:layout_margintop="2dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> </linearlayout>
recyclerview设置的adapter类
class adapter extends recyclerview.adapter { private list<string> datas = new arraylist<>(); public void setdatas(list<string> datas) { this.datas = datas; } @nonnull @override public recyclerview.viewholder oncreateviewholder(@nonnull viewgroup viewgroup, int i) { view view = layoutinflater.from(viewgroup.getcontext()).inflate(android.r.layout.simple_list_item_1, viewgroup, false); return new viewholder(view); } @override public void onbindviewholder(@nonnull recyclerview.viewholder viewholder, int position) { viewholder holder = (viewholder) viewholder; holder.textview.settext(datas.get(position)); } @override public int getitemcount() { return datas.size(); } } class viewholder extends recyclerview.viewholder { textview textview; public viewholder(@nonnull view itemview) { super(itemview); textview = itemview.findviewbyid(android.r.id.text1); } }
recyclerview item的布局文件用的是android系统提供的一个比较简单的布局,android.r.layout.simple_list_item_1。
对searchview设置监听事件
searchview.setonquerytextlistener(new searchview.onquerytextlistener() { @override public boolean onquerytextsubmit(string query) { return false; } @override public boolean onquerytextchange(string newtext) { if (textutils.isempty(newtext)) { adapter.setdatas(datas); adapter.notifydatasetchanged(); } else { adapter.setdatas(search(newtext)); adapter.notifydatasetchanged(); } return false; } });
由于是本地搜索,希望的效果是可以实时搜索,每输入一个字符,就重新搜索一次,于是将搜索事件放到了onquerytextchange()方法中,如果不希望实时搜索,可以将过滤数据源的逻辑放到onquerytextsubmit()方法中,当软键盘弹起的时候,我们会看到软键盘上右下角是一个搜索的按钮。点击此按钮就会触发一次搜索。
完整的java代码如下:
public class mainactivity extends appcompatactivity { private static final string tag = "mainactivity"; private searchview searchview; private recyclerview recyclerview; private adapter adapter; private list<string> datas; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); searchview = findviewbyid(r.id.search_view); recyclerview = findviewbyid(r.id.recycler_view); adapter = new adapter(); datas = generatedatas(); adapter.setdatas(datas); recyclerview.setlayoutmanager(new linearlayoutmanager(this)); recyclerview.setadapter(adapter); searchview.setonquerytextlistener(new searchview.onquerytextlistener() { @override public boolean onquerytextsubmit(string query) { return false; } @override public boolean onquerytextchange(string newtext) { if (textutils.isempty(newtext)) { adapter.setdatas(datas); adapter.notifydatasetchanged(); } else { adapter.setdatas(search(newtext)); adapter.notifydatasetchanged(); } return false; } }); } private list<string> search(string query) { list<string> filterdatas = new arraylist<>(); for (string source : datas) { if (source.contains(query)) { filterdatas.add(source); } } return filterdatas; } private list<string> generatedatas() { list<string> list = new arraylist<>(); for (int index = 0; index < 10; index++) { list.add("hello world " + (index + 1)); } return list; } class adapter extends recyclerview.adapter { private list<string> datas = new arraylist<>(); public void setdatas(list<string> datas) { this.datas = datas; } @nonnull @override public recyclerview.viewholder oncreateviewholder(@nonnull viewgroup viewgroup, int i) { view view = layoutinflater.from(viewgroup.getcontext()).inflate(android.r.layout.simple_list_item_1, viewgroup, false); return new viewholder(view); } @override public void onbindviewholder(@nonnull recyclerview.viewholder viewholder, int position) { viewholder holder = (viewholder) viewholder; holder.textview.settext(datas.get(position)); } @override public int getitemcount() { return datas.size(); } } class viewholder extends recyclerview.viewholder { textview textview; public viewholder(@nonnull view itemview) { super(itemview); textview = itemview.findviewbyid(android.r.id.text1); } } }
下载地址:
上一篇: 酷冷展示全封闭式散热主机:W-3175X+半导体散热系统
下一篇: mysql复制表结构和数据