Android得到的联系人的list排序
2017-03-20 00:00
176 查看
摘要: 无摘要
需要四个参数,和三个工具类,就7个条件
动态添加MessageConnect对象以及所有对象的位置的改变的更新的方法
只需要传入正确的参数即可。
用到了三方的WaveSideBar:
最后设置它的监听即可实现简单的快速查看联系人的功能
需要四个参数,和三个工具类,就7个条件
//这类直接可以得到一个联系人排好序的List //需要三个List一个是原始的装有Message的对象的List,一个是最后要得到的List,以及用来排序的来装String拼音 的List,还有一个是用来查找已经排好序的对象的Map,以及一个记录Message对象的位置的Map,只有第二个参数是初 始化后设置的有内容的,其他的只需要初始化传进去即可。 //还有几个工具类需要用到,下面已经给出 public class ZzmGetTheSortObject { public static List<MessageConnect> getTheSortObjectList(List<String> sortString, List<MessageConnect> originalSort, List<MessageConnect> lastSort, Map<String, MessageConnect> toGetSortString,Map<String, Integer> getPositionOfMessageConnect) { int ii = 1; MessageConnect messageConnect = new MessageConnect("#"); messageConnect.setType("2"); lastSort.add(messageConnect); for (int i = 0; i < originalSort.size(); i++) { String pinYin = ZzmPinYinUtils.getPingYin(originalSort.get(i).getName()); originalSort.get(i).setType("1"); if ("original".equals(pinYin)) { ++ii; lastSort.add(lastSort.size(), originalSort.get(i)); } else { sortString.add(pinYin); toGetSortString.put(pinYin, originalSort.get(i)); } } Collections.sort(sortString); for (int i = 0; i < sortString.size(); i++) { String a = (sortString.get(i).toCharArray()[0] + "").toUpperCase(); String b = sortString.get(i); if (!lastSort.contains(a)) { MessageConnect c = new MessageConnect(a); c.setType("2"); lastSort.add(lastSort.size() - ii, c); } lastSort.add(lastSort.size() - ii, toGetSortString.get(b)); } for (int i = 0; i < lastSort.size(); i++) { Log.i("zengzeming", " name: " + lastSort.get(i).getName() + " type: " + lastSort.get(i).getType() ); } return lastSort; } }
//把中文转化为英文 //需要用到一个jar,pinyin4j-2.5.0.jar,在http://download.csdn.net/download/seamless_yang/6962659 网站下载 public class ZzmPinYinUtils { public static String getPingYin(String inputString) { HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); format.setCaseType(HanyuPinyinCaseType.LOWERCASE); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); format.setVCharType(HanyuPinyinVCharType.WITH_V); char[] input = inputString.toCharArray(); if (java.lang.Character.toString(input[0]).matches("[\\u4E00-\\u9FA5]+")) { try { String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[0], format); return temp[0]; } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) { Log.e("pinyin", badHanyuPinyinOutputFormatCombination.toString()); } } else if (ZzmJudgeCharUtils.judge(inputString.toCharArray()[0] + "")) { return inputString; } return "original"; } }
//判断是否是字母或者中文 public class ZzmJudgeCharUtils { public static boolean judge(String str) { Pattern p = Pattern.compile("[a-zA-Z]"); Matcher m = p.matcher(str); if (m.matches()) return true; p = Pattern.compile("[0-9]"); m = p.matcher(str); if (m.matches()) return false; p = p.compile("[\u4e00-\u9fa5]"); m = p.matcher(str); if (m.matches()) return false; return false; } }
//排序的方式 public class ZzmLettersComparatorUtils implements Comparator<String> { @Override public int compare(String o1, String o2) { int a = (o1.charAt(0) + "").toUpperCase().hashCode(); int b = (o2.charAt(0) + "").toUpperCase().hashCode(); return a - b; } }
动态添加MessageConnect对象以及所有对象的位置的改变的更新的方法
只需要传入正确的参数即可。
//参数是getTheSortObjectList方法中传入的一些参数,除了v,需要加入的对象数据,还要设置它的type,以及有要刷 新的adapter。 private void addConnectData(MessageConnect v, List<MessageConnect> lastSortConnect, BaseAdapter adapter, Map<String, Integer> getPositionOfMessageConnect) { String pinYin = ZzmPinYinUtils.getPingYin(v.getName()); if ("original".equals(pinYin)) { //添加到listview的最后 lastSortConnect.add(lastSortConnect.size(), v); } else { String upperCase = (pinYin.toCharArray()[0] + "").toUpperCase(); boolean is = true; for (int i = 65; i < 91; i++) { char a = (char) i; Integer b = getPositionOfMessageConnect.get(a + ""); if (b != null) { if ((a + "").hashCode() > upperCase.hashCode()) { if (is) { MessageConnect vv = new MessageConnect(upperCase); vv.setType("1"); lastSortConnect.add(b, vv); getPositionOfMessageConnect.put(upperCase, b); lastSortConnect.add(++b, v); is = false; } //改变位置 getPositionOfMessageConnect.put(a + "", (++b) + 1); } else if ((a + "").hashCode() == upperCase.hashCode()) { int position = getPositionOfMessageConnect.get(upperCase) + 1; lastSortConnect.add(position, v); for (int j = ((int) a) + 1; j < 91; j++) { char o = (char) j; Integer y = getPositionOfMessageConnect.get(o + ""); if (null != y) { getPositionOfMessageConnect.put(o + "", 1 + y); } } break; } } } } for (int i = 0; i < lastSortConnect.size(); i++) { Log.i("zengzeming", " name: " + lastSortConnect.get(i).getName() + " type: " + lastSortConnect.get(i).getType() ); } adapter.notifyDataSetChanged(); }
用到了三方的WaveSideBar:
compile 'com.gjiazhe:wavesidebar:1.2'
最后设置它的监听即可实现简单的快速查看联系人的功能
waveSideBar.setOnSelectIndexItemListener(new WaveSideBar.OnSelectIndexItemListener() { @Override public void onSelectIndexItem(String index) { Log.i("zengzeming", index); Integer position = getPositionOfMessageConnect.get(index); if (position != null) { Log.i("zengzeming", position + ""); listView.setSelection(position); } else { Log.i("zengzeming", "获取到的integer为空~~~"); } } });
相关文章推荐
- android 联系人查询结果的排序问题
- android list列表排序
- android List按时间排序
- android联系人中英文混合排序
- Android 泰语/缅甸语/捷克语下,Contacts列表中联系人出现排序错乱的
- Android中如何取得联系人,如何得到一个联系人下面的多个号码
- 仿Android联系人SideBar排序,根据拼音A-Z字母快速导航联系人姓名,以及输入搜索条件过滤,显示姓名的文字图片
- android 联系人查询结果的排序问题
- android list排序(不管list中是何种数据类型)
- Android 获取系统联系人并排序
- android 联系人 中英文排序 --代码仓库
- 排序算法Java(android)安卓中的list对象排序
- Java(android)安卓中的list对象排序
- android根据内容对list重新排序
- Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能,并挤压效果(一)
- Android List排序问题--基础知识
- Android Java List 排序
- Android中AsyncTask的处理后台耗时操作(如list排序,进度加载)
- Android在ArrayAdapter<>里如何得到List<>的Items
- Android自定义Comparator,实现List按时间排序