• 如何获得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);
    		}

    效果图:


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

  • 相关阅读:
    fedora安装后的配置
    linux下的Shell编程(7)使用-x和-n调试shell程序
    linux下的Shell编程(8)自定义函数
    linux下的Shell编程(6)case和select
    linux下的Shell编程(5)循环
    linux下的Shell编程(4)特殊的变量和占位符
    linux下的Shell编程(3)shell里的流程控制
    Linux下的Shell编程(2)环境变量和局部变量
    Linux下的Shell编程(1)最简单的例子
    Docker学习笔记
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4850051.html
Copyright © 2020-2023  润新知