这两天闲来无事,就把前短时间项目中的搜索功能抽取出来,重新写一下,搜索功能虽然简单,但是设计到得知识点也挺多的,就当做一个总结吧。
代码地址在最后面,话不多说,上效果图 _
searchdemo.gif
历史记录的存储
首先来说下关于历史记录的存储,历史记录的存储方式其实可以有很多方法,可以用sp,数据库等等,那么就直接开撸吧。说开撸你还真以为就直接开撸了,还是先想想吧,我们做历史记录存储的时候需要提供什么给调用者,其实很简单无非就是可以增删改查吗。为了遵守里氏替换原则,就先写了个抽象类BaseHistoryStorage,里面有几个抽象方法,至于是什么自己看吧。这样不管你是用SP还是数据库甚至其他更牛的技术,只需要集成Base类,实现这些抽象方法就行了,至于你是怎么实现的,我才不管呢。
/**
* 历史信息存储基类
* Created by Zellerpooh on 17/1/18.
*/
public abstract class BaseHistoryStorage {
/**
* 保存历史记录时调用
*
* @param value
*/
public abstract void save(String value);
/**
* 移除单条历史记录
*
* @param key
*/
public abstract void remove(String key);
/**
* 清空历史记录
*/
public abstract void clear();
/**
* 生成key
*
* @return
*/
public abstract String generateKey();
/**
* 返回排序好的历史记录
*
* @return
*/
public abstract ArrayList sortHistory();
}
上面的代码很好理解,SearchHistoryModel是我写的一个JavaBean,里面就放了两个String,一个是历史搜索的内容,一个是历史记录的Key,其实你直接返回一个String泛型的ArrayList的就行,但是我这里为了用SP实现的时候跟快速偷了个懒,好了自己去实现一个历史记录存储功能把。
通过SharedPreference实现数据存储
听到让你自己去实现是不是心凉了一半,当然是逗你的了,既然都来了怎么能不给你点福利呢,下面我就实现一个简单的通过SharedPreference实现的数据存储吧,来抛砖迎玉吧。
private static SpHistoryStorage instance;
private SpHistoryStorage(Context context, int historyMax) {
this.context = context.getApplicationContext();
this.HISTORY_MAX = historyMax;
}
public static synchronized SpHistoryStorage getInstance(Context context, int historyMax) {
if (instance == null) {
synchronized (SpHistoryStorage.class) {
if (instance == null) {
instance = new SpHistoryStorage(context, historyMax);
}
}
}
return instance;
}
作为一个励志成为高逼格的高级程序员的菜鸟,当然不会放过任何装逼的机会,对于这种比较耗资源的数据存储,将他设计为单例模式当然最合适不过了,上面就是一个简单的DCL的单