<强>前言强>
& # 8195; & # 8195;因为自己在做的一个小软件里面需要用到从a - z排序的列表视图,所以自然而然的想到了微信的联系人,我想要的就是那样的效果。本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太复杂了,有的简单是简单,但是不符合我的要求,所以我就来个整合,把复杂性和简单性合二为一。
<>强实现强>
& # 8195; & # 8195;先来看效果图吧:
<>强要点分析
强>
& # 8195; & # 8195;要实现这样的效果需要考虑下面的几个问题:
-
<李> 李>
<李> 李>
<李> 李>
<李> 李>
& # 8195; & # 8195;下面我们就解决这几个问题,然后就可以出现上面的效果了。
<强>【第一步】
强>
& # 8195; & # 8195;我们需要先自定义一个类,就叫滑杆吧,让它继承按钮,然后我们覆盖onDraw方法,绘制字母a - z就可以出现右边字母栏的效果了。
看一下源码:
公开课滑杆扩展按钮{ 公共接口> 公开课DataBean { 公共静态最终int TYPE_CHARACTER=0; 公共静态最终int TYPE_DATA=https://www.yisu.com/zixun/1; 私人int item_type; 私人字符串item_en; 私人字符串名称; 私人字符串电话;/*其他成员*/公共DataBean(字符串名称字符串电话,int类型){ CharacterParser解析器=CharacterParser.getInstance (); this.name=名称; 这一点。电话=电话; 这一点。item_type=类型; 这一点。.trim item_en=parser.getSelling(名字).toUpperCase () (); 如果(! item_en.matches (“[a - z] +)) { item_en=" # " + item_en; } }/* *省略得到和托架方法 */} >之前& # 8195; & # 8195;这个对象里面需要注意的是两个成员变量,item_type和item_en,分别表示该对象是要显示的正常对象还是字母分隔符对象,根据item_type的不同,我们在写适配器的getView方法的时候就可以返回不同的观点对象,然后就可以实现效果图中的正常的物品和字母分割符项了.item_en表示的是名字变量也就是汉字字符串的拼音字符串,主要是用来获取首字母和进行字符串之间的比较。
& # 8195; & # 8195;现在假设已经有了一个列表对象,里面保存了一些DataBean,那么问题来了,如何把这些DataBean对象按拼音字符串进行排序以及如何在列表对象里面添加表示字母分隔符的DataBean对象呢?
& # 8195; & # 8195;首先解决排序的问题,这个比较简单:
& # 8195; & # 8195;这里用到了集合的排序方法,这个方法有两个参数,一个就是带排序的列表对象,另一个是实现了比较器接口的类的对象,用来说明如何进行排序,用哪一个成员变量来进行排序。
& # 8195; & # 8195; PinyinComparator这个类实现了比较器:
公共类PinyinComparator实现Comparator之前 & # 8195; & # 8195;可以看的到,两个DataBean对象按照变量item_en也就是拼音字符串来进行排序,这样实现起来比较方便,不需要自己去写排序的算法了,当然也不反对大家自己去实现排序。
& # 8195; & # 8195;经过集合的排序函数排序之后,现在列表对象里面保存的DataBean对象已经是按照所有进行排序的了,现在我们要做的就是在这些对象里面插入一些用来表示字母分隔符DataBean的对象,这个实现应该比较简单,我用的方法比较笨/(ㄒoㄒ)/~ ~
公开课ListUtil { 公共静态孔隙sortList (List列表){ List _List=new ArrayList (); 集合。排序(列表,新PinyinComparator ()); DataBean DataBean=new DataBean (getFirstCharacter (list.get (0) .getItem_en ()),”“, DataBean.TYPE_CHARACTER); 字符串currentCharacter=getFirstCharacter (list.get (0) .getItem_en ()); _List.add (dataBean); _List.add (list.get (0)); for (int i=1; i< list.size();我+ +){ 如果(getFirstCharacter (list.get (i) .getItem_en ()) .compareTo (currentCharacter) !=0) { currentCharacter=getFirstCharacter (list.get (i) .getItem_en ()); dataBean=new dataBean (currentCharacter”、“DataBean.TYPE_CHARACTER); _List.add (dataBean); } _List.add (list.get (i)); } list.clear (); (DataBean bean: _List) { list.add (bean); } } 公共静态字符串getFirstCharacter (String str) { 返回str.substring (0,1); } } android仿微信联系人索引列表功能