字母导航列表完整解决方案

使用场景
对于联系人,城市列表等,按照字母排序的都常用到
---------------------------------------------------------------------------------

Demo下载

网盘链接

链接: http://pan.baidu.com/s/1jGpNLAI 密码: zeay



---------------------------------------------------------------------------------

需求分析
一般需要的基本功能为
1. 所有数据按照关键字段,一般是name姓名,进行拼音字母排序
2. 每个拼音的首字母第一次出现的位置,额外显示个字母栏header,如图片中顶部的M和下面的N
3. 右侧有一个字母导航栏,从A~Z排序,有两种
     1) 显示所有字母,如图1
     2) 只显示列表中全部数据有的首字母,如图2
4. 选中字母导航栏时(DOWN按下,和MOVE按下后移动)则会让列表跳转到该字母首次出现的位置,如图1的M
     通常还会同时在屏幕居中位置显示一个提示框,提醒当前选择的字母
     注意: 如果是上面3中的1)情况,则可能出现选择了某字母,但是列表中没有该数据,则只显示提示框,不作列表跳转

图1



图2


---------------------------------------------------------------------------------

首字母数据来源
1.服务器返回
     条件允许的情况下,尽量让服务器直接提供该字段,最好同时提供name对应的拼音和大写首字母,至少也要提供拼音
2.客户端解析
     服务器不提供只能本地解析了,如利用pinyin4j等第三方工具将中文转为拼音字母
服务器处理的好处是,只要处理一次再保存到数据库中即可,而客户端需要每次获取数据的时候都转一遍比较慢

---------------------------------------------------------------------------------

数据排序
1.服务器排序
     服务器在获取数据时按照关键字段的拼音进行排序,返回给终端
2.本地排序
     服务器不提供的情况下,或者本地进行数据修改后造成排序集合混乱的情况下,则需要客户端进行再次排序
排序方法如下
  1. Collections.sort (datas , new Comparator<DataBean>() {
  2.       @Override
  3.       public int compare(DataBean lhs, DataBean rhs) {
  4.             return lhs.getName().compareTo(rhs.getName());
  5.      }
  6. });
复制代码


利用Collections.sort排序方法,第一个为需要排序的数据List集合,第二个为比较器,提供排序规则
在compare方法中处理规则,两个参数分别是需要对比的俩数据,
这里我们可以让他们的拼音字段进行compareTo比较,String类型的拼音会自动按照字母升序排列
注意: 如果服务器只返回中文,需要转为拼音后排序

---------------------------------------------------------------------------------

列表首字母第一次出现位置的处理逻辑
前提是数据已经按照字母顺序排好了,如果是乱序那首字母第一次出现的位置就没有意义了
通常会用一个Map键值对集合保存数据
key为String类型,对应首字母
value为Integer型,对应字母首次出现的位置索引

处理方法
方式1. 循环数据集合,如果map中没有这个key首字母,就保存首字母和此时的index
     之后再获取到数据首字母是集合中存在时,就代表不是第一次存在,就不作做put操作了
  1. // 初始化<首字母, 首字母第一次出现位置>的键值对
  2. letterPositionMap = new HashMap<String, Integer>();
  3. for (int i = 0; i < datas .size(); i++) {
  4.      DataBean data = datas.get(i);
  5.      String firstletter = data.getFirstLetter();
  6.       // 不包含代表是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值