Android带索引联系人列表
网上Android联系人列表的样例也非常多,都和微信的联系人差点儿相同,因为项目用到了联系人列表索引功能(产品把字母item给去掉了),只是也还是好实现。这里我也来分享分享我的实现,免得以后忘了。那先看看效果(Demo在结尾有下载地址):
要达到的效果就是这么简单。
先说说思路吧:首先为联系人对象加入一个pinyin字段,当获取到了联系人原始数据后,把每一个联系人的名字转换为拼音。并为pinyin字段设置值。
然后获取联系人中出现过哪些字母的拼音保存为数组(这就是字母的item),然后和联系人拼音再组合成新的数组,利用Arrays.sort排序功能,就依次按字母顺序拍好了联系人列表,接下来就是把字母在联系人列表中出现的位置给保存起来,绘制右边字母索引时,给对应的字母设置当前字母在联系人列表的位置,滑动到某一个字母是,就把listview移动到那个位置即可了。
一:先看看提取联系人中出现的字母,并排序
/**
* 把数据排序。并把A-Z顺序加进去
*
* @param carTypes
* @return
*/
public String[] sortIndex(List<ConstastBean> constastBeans) {
TreeSet<String> set = new TreeSet<String>();
for (ConstastBean constastBean : constastBeans) {
char ch = constastBean.getPinyin().charAt(0);
set.add(String.valueOf(ch).toUpperCase(Locale.getDefault()));// 获取出现的首字母
}
String[] names = new String[constastBeans.size() + set.size()];// 新数组,用于保存首字母 + 联系人拼音
int i = 0;
for (String string : set) { // 把set中的字母加入到新数组中(前面)
names[i] = string;
i++;
}
<span style="white-space:pre"> </span>//把联系人拼音提取到一个数组中
String[] pyheader = new String[constastBeans.size()];
for (int j = 0; j < constastBeans.size(); j++) {
pyheader[j] = constastBeans.get(j).getPinyin();
} System.arraycopy(pyheader, 0, names, set.size(), pyheader.length);// <span style="font-family: Arial, Helvetica, sans-serif;">把联系人拼音加入到后面,结果就是联系人拼音和出现过的首字母在一个数组里面(是无序的)</span> // 自己主动依照首字母排序
Arrays.sort(names, String.CASE_INSENSITIVE_ORDER);// 严格依照字母顺序排序,忽略字母大写和小写,结果为按拼音排序的数组返回
return names; }
这个返回的就是排好序的字母顺序了(如[A, 安妮,G,盖伦...Z])。
二:接下来就是依据返回的顺序,把联系人对象排序
/**
* 依据名字排序对数据进行排序 由于默认是数字在首位,为了把数字排到末尾,须要进行转换
*
* @param arry
* @return
*/
public ArrayList<ConstastBean> getAllLists(String[] arry)
{
ArrayList<ConstastBean> lists = new ArrayList<ConstastBean>();// 保存排好序的数据
ArrayList<ConstastBean> lists2 = new ArrayList<ConstastBean>();// 保存数字开头的数据
ArrayList<ConstastBean> lists3 = new ArrayList<ConstastBean>();// 保存字母数据
// 对数据进行排序
for(int i = 0; i < arry.length; i++)
{
for(int j = 0; j < sourceData.size(); j++)
{
if(arry[i].equals(sourceData.get(j).getPinyin()))
{
lists.add(sourceData.get(j));
break;
}
// else //须要显示单个字母的item,这里就不用凝视。在adapter中应给为这个item单独设置一个布局
// {
// ConstastBean contactBean = new ConstastBean();
// contactBean.setPinyin(arry[i]);
// contactBean.setNickName(arry[i]);
// lists.add(contactBean);
// break;
// }
}
}
// 分离出数字数据和字母数据
int index = getLetter(lists);// 获取字母开头的位置
for(int i = 0; i < lists.size(); i++)
{
if(i < index)
{
lists2.add(lists.get(i));
}
else
{
lists3.add(lists.get(i));
}
}
lists.clear();
lists.addAll(lists3);
lists.addAll(lists2); return lists;
}
因为排好序的是数字在字母前面,可是这里须要数字在后面,所以先查询第一个字母出现的位置。然后从那个位置截取为2个集合。再把数字集合加入到字母集合后面即可了。
三:初始化工作都做好了。就该遍历获取每一个字母所相应的位置了
<span style="white-space:pre"> </span>selector = new HashMap<String, Integer>();
// 遍历排好序的数据,获取每一个字母的位置
for (int i = 0; i < indexStr.length; i++) {
for (int j = 0; j < datas.size(); j++) {
if (datas.get(j).getPinyin().toLowerCase(Locale.getDefault()).startsWith(indexStr[i<span style="white-space:pre"> </span>].toLowerCase(Locale.getDefault()))) {
selector.put(indexStr[i], j);
break;
}
String pinyin = datas.get(j).getPinyin();
if(indexStr[i].equals("#") && isNumeric(pinyin.substring(0,1)))
{
selector.put(indexStr[i], j);
return;
}
}
}
返回的结果就类似于这样的:{D=2, #=23, E=4, G=5, A=0, L=11, M=12, N=14, H=6, J=8, K=10, T=19, V=20, S=16, R=15, Z=21}
/**
* 绘制索引条
*/
public void drawIndexView() {
LinearLayout.LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, height);
for (int i = 0; i < indexStr.length; i++) {
TextView tv = new TextView(this);
tv.setLayoutParams(params);
tv.setText(indexStr[i]);
tv.setGravity(Gravity.CENTER);
tv.setTextColor(this.getResources().getColor(R.color.indexs_color));
tv.setTextSize(13); layoutIndex.addView(tv); layoutIndex.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
float y = event.getY();
int index = (int) y / height;// 得到点击字母位置的索引
String key = "";
if (index < indexStr.length && index > -1) {
key = indexStr[index];
if (selector.containsKey(key)) {
int position = selector.get(key);
if (listView.getHeaderViewsCount() > 0) {// 加入的header给去掉
listView.setSelectionFromTop(
position + listView.getHeaderViewsCount(), 0);
} else {
listView.setSelectionFromTop(position, 0);// 滑动到第一项
}
}
if (key.equals("↑"))
{
listView.setSelectionFromTop(0, 0);// 滑动到第一项
}
}
if(!key.equals(""))
{
showTv.setText(key);
showTv.setVisibility(View.VISIBLE);
} switch (event.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
showTv.setVisibility(View.GONE);
break;
case MotionEvent.ACTION_DOWN:
// layoutIndex.setBackground();
break;
} return true;
}
});
}
}
这样就完毕了带索引的联系人列表的实现:Demo源代码下载
Android带索引联系人列表的更多相关文章
- Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]h ...
- 【Android Developers Training】 98. 获取联系人列表
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android实现SQLite数据库联系人列表
Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...
- Android实现“是否退出”对话框和“带图标的列表”对话框
今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...
- Android Phonebook编写联系人UI加载及联系人保存流程(三)
2014-01-07 09:54:13 将百度空间里的东西移过来. 本文从点击“添加联系人”Button开始,分析新建联系人页面UI是如何加载,以及新的联系人信息是如何保存的,借此,我们一探Phon ...
- Android 读取手机联系人、拨号、发送短信及长按菜单的操作
本示例实现了读取手机联系人,拨号.发送短信及长按出现菜单选项的操作↓ 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下↓ a, main.xml 程序运行的主界面,主要 ...
- 动手分析安卓仿QQ联系人列表TreeView控件
因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码. 一. 需要用 ...
- 列表的初识,列表的索引切片,列表的增删改查,列表的嵌套,元组的初识,range
1 内容总览 列表的初识 列表的索引切片 列表的增删改查 列表的嵌套 元组的初识(了解) 元组的简单应用(了解) range 2 具体内容 列表的初识 why: str: 存储少量的数据.切片出来全都 ...
- C#:基于WMI查询USB设备信息 及 Android设备厂商VID列表
/* ---------------------------------------------------------- 文件名称:WMIUsbQuery.cs 作者:秦建辉 MSN:splashc ...
随机推荐
- 优动漫PAINT-樱花教程
很雅致清新的樱花教程~在很多地方都可以运用到哟~原文转载自优动漫官网. 想要Get到更多有关优动漫的信息包括软件下载,可关注http://www.dongmansoft.com.
- 3ds Max灯光教程之卧室灯光布局实例
对于设计师来说要做好一张好的作品效果图包括很多比如:“造型.色彩搭配.灯光气氛.构图角度等等,上次给大家详细的分析了下产品渲染中摄像机的构图及原理.本期教程来跟大家讨论一下max场景灯光布局问题.以卧 ...
- HDU-1052 Tian Ji -- The Horse Racing 贪心 考虑特殊位置(首尾元素)的讨论
题目链接:https://cn.vjudge.net/problem/HDU-1052 题意 田忌赛马问题扩展版 给n匹马,马的能力可以相同 问得分最大多少 思路 贪心做得还是太少,一开始一点思虑都没 ...
- 【转载】spring-boot 项目跳转到JSP页面
原路径:https://blog.csdn.net/qq_36820717/article/details/80008225 1.新建spring-boot项目 目录结构如下 2.新建TestCon ...
- vue路由知识整理
vue路由知识整理 对于单页应用,官方提供了vue-router进行路由跳转的处理.我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(compo ...
- word break相关问题的解法
https://leetcode.com/problems/word-break/?tab=Description 以及 https://leetcode.com/problems/concatena ...
- css中使用id和class 的不同
在 CSS 中,类选择器以一个点号显示: .center {text-align: center} 在上面的样例中,全部拥有 center 类的 HTML 元素均为居中. 在以下的 HTML 代码中, ...
- 使用bbed恢复表数据
对于表级别的数据恢复,ORACLE提供了多种恢复方法:flashback query,logmnr等. 本文通过演示样例演示使用bbed的copy命令恢复用户误删除或者损坏的表数据,当然我们也能够使用 ...
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.htm ...
- 10.bitset
#include <iostream> //位运算,处理二进制非常方便,线性存储 #include <bitset> #include <string> using ...