欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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);
        }
    }
}

下载地址:

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