IM应用和许多具有IM功能的应用都少不了Contacts这个功能,就像Wechat里通讯录一样,这里不能上传图片啊。。。。。。。。。。。。。
实现这一功能需要以下几步:
- 自定义一个View
- 创建通讯录中User对象
- 初始化View时对User对象进行排序
自定义字母表:
这个View中有两个变量,一个是26个字母,一个是被用户选中的index
private String[] letters={"A","B","C","D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#"};private int choose=-1;</pre>
这个View的onMeasure方法由于没有什么需要特别布置的,所以采用默认的就可以啦,然后是onDraw函数:
for(int i=0;i<letters.length;i++){ paint.setColor(Color.WHITE); paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setAntiAlias(true); paint.setTextSize(PixelUtils.sp2px(12)); if(i==choose){ paint.setColor(Color.BLACK); paint.setFakeBoldText(true); paint.setTextSize(PixelUtils.sp2px(15)); float xSpec=0; float ySpec=singleHeight*i; canvas.drawText(letters[i], xSpec, ySpec, paint); paint.reset(); continue; } float xPos=width/2-paint.measureText(letters[i])/2; float yPos=singleHeight*i+singleHeight; canvas.drawText(letters[i],xPos,yPos,paint); paint.reset(); }这个函数也很简单,就是计算得到单个字母所需要的宽度和高度,然后在居中位置写下Text,但是对用户choose的字母要特别处理,下面是onTouch函数:
switch(ev.getAction()){ case MotionEvent.ACTION_MOVE: int height=getHeight(); int yPos=(int)ev.getY(); int indexY=yPos*letters.length/height; choose=indexY; invalidate(); break; case MotionEvent.ACTION_UP: choose=-1; invalidate(); break;} return true;</pre>
这里就是对 choose 赋值啦,至于为什么返回 true。。呵呵,我也不知道,按道理说这个最底层的 view,返回什么都应该没有关系了吧?有高人看到了可否解答一下,先谢谢了!
创建User对象:
这一步很简单,举个例子:
public class SortUser {private AVUser user; private String sortLetters; public AVUser getUser(){ return user; } public void setUser(AVUser user){ this.user=user;} public String getSortLetters(){ return sortLetters;} public void setSortLetters(String letters){ this.sortLetters=letters;}
}
这里就是原本的 User 加上新的 sortLetter 属性,构成了一个新的对象。sortLetter 当然就是用来给 Users 排序的啦!
排序过程:
for(AVUser user:friends){ SortUser sortUser=new SortUser(); sortUser.setUser(user); String username=user.getString("nickname"); if(username!=null){ String pinyin = characterParser.getSelling(username); String sortString = pinyin.substring(0, 1).toUpperCase(); if (sortString.matches("[A-Z]")) { sortUser.setSortLetters(sortString.toUpperCase()); } else { sortUser.setSortLetters("#"); } }else{ sortUser.setSortLetters("#"); } sortUsers.add(sortUser); } Collections.sort(sortUsers, pinyinComparator); return sortUsers;这里可以看到,第一步就是将汉字转化为拼音,然后利用Collections的sort方法进行排序,这里说一下Colletions.sort的用法吧,有两种用法,这里只说用到的这种:
public static <T> void sort(List<T> list, Comparator<? super T> comparator)Comparator是需要我们去继承的,例如,在我的例子中,就是这个:public static class PinyinComparator implements Comparator<SortUser> { public int compare(SortUser o1, SortUser o2) { if (o1.getSortLetters().equals("@") || o2.getSortLetters().equals("#")) { return -1; } else if (o1.getSortLetters().equals("#") || o2.getSortLetters().equals("@")) { return 1; } else { return o1.getSortLetters().compareTo(o2.getSortLetters()); } }}</pre>
可以看到这里重写了一个compare的方法,返回-1,1分别代表排在前面和后面。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于