如何获得android手机通讯录的字母显示(两)

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

于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);
		}

效果图:

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

时间: 2024-10-24 21:23:07

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

Android手机通讯录备份还原代码

实现方法很简单1.把通讯录中的联系人,电话号码保存到txt文件中完成备份.2.读取txt文件,导入到通讯录完成还原. 具体代码1.添加 通讯录读写权限,存储卡写权限 <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission><uses-permission android:name="android.permission.WRITE_EXT

如何获取android手机联系人并按字母展示(一)

android提供了本地数据库的查询uri,可以查询出数据: 采用一个AsyncQueryHandler来进行查询, AsyncQueryHandler自己开启了线程来进行数据查询,很方便 protected AsyncQueryHandler mQueryHandler; protected final void queryPersonal() { mQueryHandler.startQuery(QUERY_TOKEN, null, ContactsContract.Contacts.CON

如何获取android手机联系人并按字母展示(二)

下面写怎么让每个首字母相同的联系人归类展示: 在adapter implement SectionIndexer 这样adapter里必须实现以下3个接口: @Override public Object[] getSections() { //section的集合 } @Override public int getPositionForSection(int section) {//当前section的位置 } @Override public int getSectionForPositi

如何获取android手机联系人并按字母展示(三)

如果获取contact的头像信息并展示: 如何根据photoId来获取bitmap: public static Bitmap getContactPhoto(Context context, long photoId, BitmapFactory.Options options) { if (photoId < 0) { return null; } Cursor cursor = null; try { cursor = context.getContentResolver().query(

android 手机欢迎界面不显示的问题?

android 手机欢迎界面不显示的问题?今天遇到了也很郁闷. 是因为, 现在的手机比较的高端, android 4.4以上的手机, 手机的分辨率普遍都是 1080*1920 左右的, 所以App 内部调用的时候, 没有调用Drawable 和  hdrawable,  xdrawable 都没有走.  因为他们好像只走了  xxDrawable! android 的适配无疑是最恶心的!

仿IOS通讯录效果,实现获取手机通讯录、字母排序显示、搜索联系人、拨打电话

1.使用UITableView,实现联系人字母排序.点击字母跳转显示联系人组目录: 2.使用UISearchController,实现联系搜索,动态显示符合查询的联系人: 3.点击通讯录列表项,显示联系人信息(使用自定义模式化窗口类似与UIAlertView,使用UIwindow实现),点击拨号,可以直接拨打电话: 4.实现获取手机通讯录里面的联系人信息: 详情见资源:http://download.csdn.net/detail/u011622479/9505751 效果图如下: 获取联系人:

Android手机通讯录

1.概述 最近由于项目需求,需要做一个查看手机通讯录,并且取出相应的数据.类似于下图: 用到的一个主要的知识点:SectionIndexer--能够有效地帮助我们对分组进行控制,由于SectionIndexer是一个接口,你可以自定义一个子类来实现SectionIndexer, 不过自己再写一个SectionIndexer的实现太麻烦了,这里我们直接使用Android提供好 的实现AlphabetIndexer,用它来实现联系人分组功能已经足够了.AlphabetIndexer的构造函数需要传入

Android手机通讯录项目开发--联系人数据库contacts2.db介绍

项目描述:该项目为基于Android平台的手机通讯录,主要模块分为四个部分:联系人管理模块,通话记录管理模块,短信管理模块,系统设置模块. 系统结构图如下: 本项目启动时间:2014年5月28日 说明:本次开发项目的所有源码全部会分享给大家.开发此项目的目的有这几点:一.锻炼独立开发项目的能力,二.增加对Android开发的了解,三.熟悉Android通讯录机制. 闲话不多说,正式开始! 技术要点一:熟悉Android联系人数据库contacts2.db 1.获得联系人数据库contacts2.

Android手机通讯录解析

相关图片上传麻烦,原文件到我的博客上传的文件里下载. 1.通讯录应用介绍 通讯录应用是Android自带的应用程序,我们看到此应用的时候,可能只认为这是一个应用,用数据库存储数据,但是实际上不是这样的. 通讯录是ContentProvider的应用,通讯录由两部分组成: (1)com.android.providers.contacts的ContentProvider:真正存储数据的ContentProvider (2)com.android.contacts:运用ContentResolver