随后的写如何使各第一字母显示相同的分类触点:

于adapter implement SectionIndexer

这项adapter必须在下面可以实现3接口:

		@Override
public Object[] getSections() { //section的集合 } @Override
public int getPositionForSection(int section) {//当前section的位置 } @Override
public int getSectionForPosition(int position) {//当前position的section信息 }

所以我们必须把取到的本地联系人的数据进行加工

定义一个来存储section的信息:

 private class SectionTitle{
public String title; public SectionTitle(){
title = "";
} public String toString(){
return title;
}
}

定义下面结构来获取实现sectionIndexer所要的信息:

	private class ContactSectionMapper implements SectionIndexer {

		private SectionTitle[] mSections = null;
private SparseIntArray mSectionPositionMap = null;
private SparseIntArray mPositionSectionMap = null; public ContactSectionMapper(SectionTitle[] sectionDatas) {
mSections = sectionDatas;
} public void changeData(SparseIntArray sectionPositionMap, SparseIntArray positionSectionMap) {
mSectionPositionMap = sectionPositionMap;
mPositionSectionMap = positionSectionMap;
} @Override
public Object[] getSections() {
return mSections;
} /**
* 找出这个section相应的position
*/
@Override
public int getPositionForSection(int section) {
if (mSectionPositionMap == null)
return -1; if (section == 0)
return -1; return mSectionPositionMap.get(section, -1);
} /**
* 找出这个position相应的section
*/
@Override
public int getSectionForPosition(int position) {
if (mPositionSectionMap == null)
return -1; if (position <= 0)
return 0; return mPositionSectionMap.get(position, -1);
} /**
* @param position
* @return
*/
public boolean isSection(int position) {
if (position == 0)
return true; int sectionIdx = getSectionForPosition(position);
int sectionPosition = getPositionForSection(sectionIdx); if (sectionIdx == -1 && sectionPosition == -1)
return false; return (position == sectionPosition);
} public String getSection(int position) {
if (mSections == null)
return NONE_ENGLISH_LETTER_TITLE; int sectionIndex = getSectionForPosition(position);
if (sectionIndex < 0 || sectionIndex >= mSections.length)
return NONE_ENGLISH_LETTER_TITLE; return mSections[sectionIndex].toString();
} }

在adapter里面我们重载changeCursor(每次cursor改变都会调用)这种方法。进行加工,取出数据的首字母信息

<span style="white-space:pre">		</span>@Override
public void changeCursor(Cursor c) {
processCursor(c);
super.changeCursor(c);
} private void processCursor(Cursor c) { /** define some variables */
SparseIntArray sectionPositionMap = new SparseIntArray();
SparseIntArray positionSectionMap = new SparseIntArray(); for(int i = 0; i < mSectionDatas.length; i++){
mSectionDatas[i].title = "";
} if (c == null || c.getCount() == 0 || c.isClosed()){
mSectionMapper.changeData(sectionPositionMap, positionSectionMap);
return;
} String curtitle = ""; int i = 0;
int position = 0;
while (c.moveToNext()) {
position = c.getPosition(); String curLetter = getTitle(getDisplayName(c)); //看看当前的名字的第一个名字是什么。是不是section的开头
if (TextUtils.isEmpty(curtitle) || !TextUtils.equals(curLetter, curtitle)) {
mSectionDatas[i].title = curLetter;
//这个当前的名字是section的开头
sectionPositionMap.put(i, position);
curtitle = curLetter;
i++;
}
positionSectionMap.put(position, i - 1);
} for(; i < mSectionDatas.length; i++){
mSectionDatas[i].title = curtitle;
sectionPositionMap.put(i, position);
}
mSectionMapper.changeData(sectionPositionMap, positionSectionMap);
}

在adapter的初始化里面:

	protected final class ContactsAdapter extends ResourceCursorAdapter implements SectionIndexer,OnScrollListener {

		protected boolean mLoading = true;
private ContactSectionMapper mSectionMapper = null;
private SectionTitle[] mSectionDatas = null;
private static final int SECTION_COUNT = 27; public ContactsAdapter(Context context) {
super(context, R.layout.contacts_list_item_photo,null); mSectionDatas = new SectionTitle[SECTION_COUNT];
for (int i = 0; i < SECTION_COUNT; i++) {
mSectionDatas[i] = new SectionTitle();
}
mSectionMapper = new ContactSectionMapper(mSectionDatas);
}

<span style="white-space:pre">		</span>@Override
public Object[] getSections() {
return mSectionMapper.getSections();
} @Override
public int getPositionForSection(int section) {
return mSectionMapper.getPositionForSection(section);
} @Override
public int getSectionForPosition(int position) {
return mSectionMapper.getSectionForPosition(position);
}

效果图:

版权声明:本文博主原创文章。博客,未经同意不得转载。

如何获得android手机通讯录的字母显示(两)的更多相关文章

  1. python实现将android手机通讯录vcf文件转化为csv

    经常会遇到将手机通讯录导出到电脑并转化为在电脑中可编辑的情况,在网上搜索了很久当前不外乎两种处理方式.1.使用电脑的outlook的通讯簿功能,将手机导出的vcf文件导入到outlook的通讯录中,然 ...

  2. Android 开发学习进程0.17 Android资源文件selector textview显示两种不同字体

    selector 是安卓资源文件的一种,它可以使按钮等实现不同状态下的不同UI,不用在代码中实现,而使用方式有两种,一种在color文件下 创建.xml可以使按钮等字体在不同状态下的变化,其二是在dr ...

  3. 怎样获取android手机联系人并按字母展示(一)

    android提供了本地数据库的查询uri,能够查询出数据: 採用一个AsyncQueryHandler来进行查询, AsyncQueryHandler自己开启了线程来进行数据查询,非常方便 prot ...

  4. 怎样获取android手机联系人并按字母展示(三)

    假设获取contact的头像信息并展示: 怎样依据photoId来获取bitmap: public static Bitmap getContactPhoto(Context context, lon ...

  5. Qt for Android(一)Qt在Android手机上全屏显示

    1.在程序的编译路径下找到AndroidManifest.xml文件,具体路径如下: 2.在pro文件中添加一句话: ANDROID_PACKAGE_SOURCE_DIR = $$PWD/Androi ...

  6. ionic ng-src 在网页显示,但是导出apk在android手机中运行不显示图片

    解决方法参照: http://stackoverflow.com/questions/29896158/load-image-using-ng-src-in-android-ionic-aplicat ...

  7. 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。

      package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...

  8. Android程序设计-简单手机通讯录

    在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图 ...

  9. 【Android Demo】简单手机通讯录

    Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息.Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view. ListView 是 ...

随机推荐

  1. Fitnesse用系列三

    动态决策表 动态决策表是新出,版本号到今年年初还没有了.我看了看文档和演示文稿样本,其效果是作为一种辅助通用决策表.它不是easy匹配的名称和发射.但假设只有一个或两个参数.不管名字怎么都找不到,这并 ...

  2. 再说JNDI

    说到JNDI,即熟悉又陌生,熟悉在常常使用,如EJB3.0中的@EJB注入,底层实现即是JNDI的方式:喜闻乐见的: Context ctx=new InitialContext(); Object ...

  3. Ubuntu 12.04开启3D桌面特效

    1.设定软件源,更新软件 点击左边栏Dash主页(Ubuntu图标),输入更新管理器,会出现更新管理器,打开后点设置,弹出软件源对话框,为确保能够正常更新,选主服务器 点击检查,更新完后,点重启 2. ...

  4. W5500 keep-alive的用途及使用

    大家是否遇到过这种问题,W5500作为server已经建立连接,突然网线掉了,然后再去连接W5500.就连不上了. 为什么?以下对这个问题进行解释说明,并提出解决的方法. 图1中的上位机程序作为cli ...

  5. BootStrap -- Grid System

    <script src="jquery.1.9.js"></script> <script src="js/bootstrap.min.js ...

  6. NTP方式保证以时间戳同步可靠性

    数据库同步的方式有设置标志位同步方式.以时间戳同步的方式,对于一对一的同步这两种方式都满足,可是对于一对多的同步,则仅仅能选择时间戳的同步方式了.可是已时间戳同步的方式的一个问题是怎样可靠的保证数据能 ...

  7. 设计Mysql索引的原则

    1. 搜索的索引列,不一定是所要选择的列.换句话说,最适合索引的列是出如今WHERE 子句中的列,或连接子句中指定的列,而不是出如今SELECT keyword后的选择列表中的列. 2. 使用惟一索引 ...

  8. POJ 1905-Expanding Rods(二分法+计算几何)

    题目地址:POJ 1905 题意:一根某种材料做的直杆被夹在两面墙之间,当他受热时长度变长,就会因两面墙的挤压而向上隆起.长度变化函数为 L'=(1+n*C)*L,给定L,C,n,求向上拱起的高度H. ...

  9. MyEclipse每次修改js有另一种部署

    今天在做时间格式显示这块内容的时候.我改动了这个js函数,同一时候凝视的掉了其它的一些替换的方法,可是在浏览器中执行发现效果一点也没有改变.于是debug js,发现浏览器中识别的还是之前未改动的js ...

  10. Directx11学习笔记【十四】 使用最新的Effect框架和SDK

    由于之前一直在看directx11龙书学习,因此sdk一直用的Microsoft DirectX SDK (June 2010) 版本,最近在stackoverflow上问dx11相关问题时,一直被大 ...