最近的项目需要做本地历史记录功能,以前写的有些过时了,就在网上查了查较好的开源库、实现方式等 。最终选择了鸿洋大神的流式布局,再搭配l工具类来实现本地历史记录功能 。同时开源库还非常适合实现产品标签(支持单选、多选)功能,所以在Demo中也有具体的使用,研究研究总是没错的 。
开源库的下载、导入等操作就不再废话了,直接开始项目演示 。
注:文章末尾附项目源码下载地址及开源库地址
效果展示
主要功能:的使用、从SP中读取历史记录、将历史记录写入到SP中、历史记录最大数量限制、历史记录不可重复、最新查询的在最前边、清楚历史记录;预先设置选中、设置最大选中数、设置标签点击和选中监听、获取选中的标签、通过完成标签选择的切换等 。方便演示加入了测试数据 。
文章插图
3.定义将历史记录写入到SP中方法:先判空,不为空则获取已有的历史记录,再将新的历史记录添加list中,最后把list转换成字符串(添加wy标识)存入到SP中 。需要注意的是:1.历史记录最大数量限制,2.历史记录不可重复,3.最新查询的在最前边 。
【支持单选、多选Android本地历史记录、及产品标签实现(附源码)(使用】
/*** 将历史记录写入到SP中*/private void writeHistory(String write) {if (TextUtils.isEmpty(write)) {return;}String writeHistory = "";//获取历史记录List readHistoryList = readHistory();//如果不重复,则添加为第一个历史记录;//如果重复,则删除已有,再添加为第一个历史记录;for (int i = 0; i < readHistoryList.size(); i++) {boolean hasWrite = readHistoryList.get(i).equals(write);if (hasWrite) {readHistoryList.remove(i);break;}}readHistoryList.add(0, write);//历史记录最多为10个if (readHistoryList.size() > 10) {readHistoryList = readHistoryList.subList(0, 10);}//将ArrayList转为Stringfor (int i = 0; i < readHistoryList.size(); i++) {writeHistory += readHistoryList.get(i) + "wy";}SharedPreferencesUtil.putString(context, "search_history", writeHistory);}
4.初始化历史记录:先通过本地历史记录判断页面的显示与隐藏,在为填充数据、设置点击事件监听 。
/*** 初始化历史记录*/private void initHistory() {final List readHistory = readHistory();if (readHistory != null && readHistory.size() > 0) {llHistory.setVisibility(View.VISIBLE);} else {llHistory.setVisibility(View.GONE);}//为FlowLayout填充数据flowlayoutHistory.setAdapter(new TagAdapter(readHistory) {@Overridepublic View getView(FlowLayout parent, int position, Object o) {TextView view = (TextView) View.inflate(context, R.layout.flowlayout_textview, null);view.setText(readHistory.get(position));return view;}});//为FlowLayout的标签设置监听事件flowlayoutHistory.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {@Overridepublic boolean onTagClick(View view, int position, FlowLayout parent) {ToastUtil.makeText(context, readHistory.get(position));etSearch.setText(readHistory.get(position));etSearch.setSelection(readHistory.get(position).length());return true;}});}
5.点击搜索按钮:首先获取输入框中的内容,然后添加到本地历史记录中,最后再调用()刷新页面数据 。具体的搜索逻辑就不写了,不是重点 。
/*** 初始化搜索*/private void initSearch() {String inputSearch = etSearch.getText().toString().trim();if (TextUtils.isEmpty(inputSearch)) {ToastUtil.makeText(context, "请输入要查询的条码");return;}writeHistory(inputSearch);initHistory();}
6.清除历史记录:将本地历史记录置为空字符串,再调用()刷新页面数据即可,大功告成 。
SharedPreferencesUtil.putString(context, "search_history", "");initHistory();