您的位置:首页 > 移动开发 > Android开发

Android得到的联系人的list排序

2017-03-20 00:00 176 查看
摘要: 无摘要

需要四个参数,和三个工具类,就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为空~~~");
}

}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息