先放效果图
场景
要求做一个通讯录页面,用来存储几千条通讯录数据。
需求
需求主要是联系人的样式,有字母标题,拼音排序,滚动时挤压效果(固定标题)
尝试
简单搜了一下,也许是我的关键词不对,只找到了一个源码。
对不起源码作者,反正是找不到出处了。但是还记得作者有说主要是结合了两个作品,
为 夏神博客Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
和 郭神博客Android系统联系人全特效实现(上),分组导航和挤压动画
但是用上手的时候有很多问题。 (注:也可能是我在自己修改的过程中新出现的冲突)
- 第一,拼音解析在代码里,数据量一大,就造成堵塞效果。。尤其在搜索框变化的时候。
- 第二,挤压效果正常情况下可用,但在搜索内容变化的时候,就不再具有了。
- 第三,第一次搜索结果为空时,删除文本,再输入结果为空的搜索内容时,会闪退。
- 第四,Fragment中使用时,固定小标题会弹出等容易修复的小问题。
总之尝试的时候填了很多坑,后来又有莫名的坑。。用着不是很放心,干脆弃了。
解决方案
拼音排序问题
因为通讯录是需要经常更新的,所以直接在后台把存储表中添加一个拼音项。具体实现不是很清楚,应该是用的pinyin4j。
但是几千条数据量有些大,服务器又有些慢,初始化要一分钟多。。干脆初始化直接SQLite读取db文件,数据更新的时候更新修改的记录。
单纯用拼音排序,又填了些小坑,以王维和万国,包拯和鲍鱼为例
- WANGWEI,WANGUO会造成王和万之间的穿插,需要分隔符;
- 也会造成BAOZHENG 和BAOYU 同音字的穿插,需要按音排序之后按字排。
使用的排序语句时 order by pinyin ,最后的格式是:
WANG 王 WEI 维;WAN 万 GUO 国;……注意全拼和字之间要有空格。
(因为SQLite有点弱,有些MySQL方法不能用;如果没有空格,会比较 WANG王 和 WAN万。。)
拼音快速检索栏
上述项目的SideBar被我保留了下来,还是挺好用的。
列表和搜索栏
弃用的第一时间是想自己写一个的,想着要写的话肯定用RecyclerView啊。
然而完全不知道怎么固定头部。。。幸好找到个高级开源sticky-headers-recyclerview
非常好用。
搜索栏比较简单,监听下内容变化,更新adapter就好了。
附:
开发期间看到的通讯录思考
虽然通讯录样式没因为这篇文章改变多少,但是多思考思考还是好的。
多音字作为姓氏的音
只是自己制作过程中的部分情况,其他完善情况暂无。
源码
使用的是AS,注意添加依赖:
compile 'com.android.support:recyclerview-v7:23.4.0'
compile 'com.timehop.stickyheadersrecyclerview:library:0.4.3'