RecyclerView+SearchView (简单实现)
简述: 简单实现点赞计数功能,按照个人想法实现文本检索功能,针对界面进行了美化。 (个人理解,有误指出)
检索功能实现思路:
控件导入:直接引入官方自带的SearchView控件,期间也是深受版本问题的困扰,如果导入控件使用androidx.appcompat.widget.SearchView报错,可以换成SearchView,(建议还是使用GUI界面拖动,版本问题是个诟病) 建议自己实现EditText。
简单思路:
(1)SearchView自带搜索图标和删除键,直接引入控件即可
(2) 实现搜索列表的即时显示,我们可以想一下,显示列表是根据数据创建一个adapter并设置显示,那么我们可以找到我们需要的数据,加入对应的List之中创建一个搜索结果的adapter,这样就能达到显示搜索结果的目的,即时性的实现采用监听器之中实现的onQueryTextChange方法,每搜索框改变一个字符便会回调该方法,每次调用该方法我们就创建一个新的adapter更新数据。
(3) 搜索文本匹配可以采用模拟匹配(小文本)或者 正则表达式匹配,但是两者的匹配标准不同(之后具体实现会提到) 。
(3) 每次找到对应的新数据之前先把原来储存用的LIst清空。
具体实现:
(1) 匹配所有的标签是否含有检索文本(搜索框的输入),我这里的子串的定义就是,按照先后顺序去掉若干个能得到目标串,这个串就称之为父串。比如:好久不见。 我们可以认定为是 “好不”的父串 ,简单来说,只要是按照顺序,能够找出每一个字符,我们就称之为父串。 实现方法:简单的正则表达式匹配 , 将输入的字符串拆分成单个字符 ,转化为正则表达式
诸如 : 字符1{1} + "[\s\S]" + 字符2{1} ,字符1{1} 代表字符1出现一次,"[\s\S]"代表匹配所有的字符(空或者非空)
这样的实现实际上就是为了贴合我们上面所说的子串理论,只要按照顺序出现一个字符1 。。。。。 字符2即可,中间出现的字符我们可以默认为任意,这样就可以用正则表达式完成文本匹配。
(2) 匹配的第二种实现,简单的模拟即可(实际上可以来个kmp),把搜索框的字符串进行拆分,去每一个标签之中寻找,每次都标记当前标签之中出现过的搜索框字符(bool数组标记即可),这样的匹配只要求出现过搜索框之中的所有字符就是合法的。 例子: 搜索框输入AS,对应的ASR在第一二种方法之中都会被匹配到 ,但是输入SA,只有第二种之中才会匹配到ASR。
不足 :按照个人理解实现的检索功能,效率过低,文本匹配的模式单一,而且无法实现光亮操作。
点赞计数实现
实现方法1. 采用图片切换的方法,首先获取一系列带数字的图片的id,设置一个计数器,然后将获取的id组成一个数组,针对对应计数器设置对应id的图片。
实现方法2. 相应的弄一个TextView,设置对应的监听器,点击一次计数器加一,设置的文本+1
(两种方法,方法二渲染时间少,占用空间少)
效果图:
(1) 正则表达式匹配 + 文本框进行更新计数
(2) 正则表达式匹配 + 图片切换计数
(3) 模拟匹配 + 图片切换计数
(4) 模拟匹配 + 文本框进行更新计数
框架图
采用的javaBean
package com.example.logindemo;
public class AlbumInfo {
public String title;
public String info;
public int imageId;
public AlbumInfo(String title, String info, int imageId) {
this.title = title;
this.info = info;
this.imageId = imageId;
}
public String getTitle() {
return title;
}
public String getInfo() {
return info;
}
public int getImageId() {
return imageId;
}
}
Recycler_View.java (方法一,模拟实现)
package com.example.logindemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Recycler_View extends AppCompatActivity {
private List<AlbumInfo> mData = new ArrayList<>();
/// 储存原始的总数据
private List<AlbumInfo> search_mData = new ArrayList<>();
/// 搜索之后的更新数据
private SearchView searchView;
@Override
protected void onCre