Android RecyclerView SearchView基本用法1
版权声明:本文为xing_star原创文章,转载请注明出处!
本文同步自http://javaexception.com/archives/82
背景:
做了很多年的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);
}
}
}
下载地址:
链接:https://pan.baidu.com/s/1HcSUpfLBcWuXyHJ7vOtCxg 密码:89sa
Android RecyclerView SearchView基本用法1的更多相关文章
- Android RecyclerView Adapter 新式用法之SortedListAdapterCallback
引言 前几天在同事的提醒下发现V7中有了一个新的工具类SortedListAdapterCallback,配合RecyclerView Adapter和SortedList一起使用更加方便的管理我们在 ...
- Android控件RecyclerView的基本用法
Android控件RecyclerView的基本用法 转 https://www.jianshu.com/p/e71a4b73098f github: https://github.com/Cym ...
- Android的搜索框SearchView的用法-android学习之旅(三十九)
SearchView简介 SearchView是搜索框组件,他可以让用户搜索文字,然后显示.' 代码示例 这个示例加了衣蛾ListView用于为SearchView增加自动补全的功能. package ...
- Android RecyclerView的基本使用
Android RecyclerView 在去年的Google I/O大会上就推出来了,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewG ...
- [Android]RecyclerView的简单演示样例
去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...
- (转载) Android RecyclerView 使用完全解析 体验艺术般的控件
Android RecyclerView 使用完全解析 体验艺术般的控件 标签: Recyclerviewpager瀑布流 2015-04-16 09:07 721474人阅读 评论(458) 收藏 ...
- Android RecyclerView 实现支付宝首页效果
Android RecyclerView 实现支付宝首页效果 [TOC] 虽然我本人不喜欢支付宝的,但是这个网格本身其实还是不错的,项目更新中更改了一个布局为网格模式,类似支付宝.(估计是产品抄袭的= ...
- android的logcat详细用法
Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...
- Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类
Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...
随机推荐
- 一条Top10热销品牌MySQL语句
表t_alibaba_data的数据结构如下: 各列含义分别是: 用户id(user_id),品牌id(brand_id),用户行为(type, 其中,点击为0,购买为1,加入收藏为2,加入购物车为3 ...
- 洛谷 P2342 叠积木 题解
本蒟蒻又来发题解了 这题是不是有点像并查集,但是那个询问的个数是不是有点骚: 所以,普通的并查集是无法解决这个问题的,这个时候就需要用到带权并查集了: 每次跑的时候都记录下它的下面有几个点,然后询问的 ...
- 这个立冬,我线下面基了一位TMD高级专家,太牛逼了!
立冬刚过,迎面而来的是一股寒气.天气如此,市场亦是如此.昨天周五,和1个认识的技术专家老刘约饭,也算是线下面基,增进感情.每年我都要向比我高阶的朋友讨教.不由自主聊到了他的职场生涯.鱼哥一直以为自己命 ...
- HDU3896 Greatest TC(双联通分量+倍增)
Problem Description TC (Tian Chao) is magical place, as you all know...The railways and the rail-sta ...
- BZOJ 3065 带插入区间K小值(sag套线段树)
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 4696 Solved: 1527[Submit][Status][Di ...
- NCPC 2016 Fleecing the Raffle
Description A tremendously exciting raffle is being held, with some tremendously exciting prizes bei ...
- 洛谷 题解 P1025 【数的划分】
将n个小球放到k个盒子中的情况总数 = (a)至少有一个盒子只有一个小球的情况数 + (b)没有一个盒子只有一个小球的情况数 这样写出表达式: a.因为盒子不加区分,那么=情况数与"将n-1 ...
- 小程序 - 解决IOS端使用css滤镜渲染出现异常
在页面渲染时,GPU默认不会开启.当css样式中出现某些规则时,就会开启GPU加速,让动画运行的更加流畅,最显著的象征就是元素的3D变换. 这些就是我们通常所说的css硬件加速,但我们有时候并不需要用 ...
- django上传并显示图片
环境 python 3.5 django 1.10.6 步骤 创建名为 testupload的项目 django-admin startproject testupload 在项目testupload ...
- 重新精读《Java 编程思想》系列之组合与继承
Java 复用代码的两种方式组合与继承. 组合 组合只需将对象引用置于新类中即可. 比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合. public class B { ...