如何获得android手机通讯录的字母显示(两)
2023-09-14 09:08:04 时间
随后的写如何使各第一字母显示相同的分类触点:
于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全屏显示隐藏状态栏_怎么调整手机状态栏的大小
- android退出app代码,Android应用退出代码各种方式
- Android RIL 调试问题分析 ——系统篇(3)
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片详解手机开发
- Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果详解手机开发
- Android控制文字水平间距android:letterSpacing详解手机开发
- 谈谈 23 种设计模式在 Android 项目中的应用详解手机开发
- Android开发学习总结(二)——使用Android Studio搭建Android集成开发环境详解手机开发
- [android] 手机卫士号码归属地查询完成详解手机开发
- android读取sd卡图片并进行缩放操作详解手机开发
- Android开发如何写出优雅的代码详解手机开发
- android应用内跳转到微信详解手机开发
- Android binder连接中,服务端如何知道客户端断开情况详解手机开发
- 如何将您的Android手机无线连接到Ubuntu
- 让 Android 手机也具备 Continuum 功能:连接大屏就能当 PC 用
- Android开发学习之WallPaper设置壁纸详细介绍与实例
- Android显式启动与隐式启动Activity的区别介绍