android list 首字母排序,Android得到的联系人的list排序

需要四个参数,和三个工具类,就7个条件

//这类直接可以得到一个联系人排好序的List

//需要三个List一个是原始的装有Message的对象的List,一个是最后要得到的List,以及用来排序的来装String拼音 的List,还有一个是用来查找已经排好序的对象的Map,以及一个记录Message对象的位置的Map,只有第二个参数是初 始化后设置的有内容的,其他的只需要初始化传进去即可。

//还有几个工具类需要用到,下面已经给出

public class ZzmGetTheSortObject {

public static List getTheSortObjectList(List sortString, List originalSort, List lastSort, Map toGetSortString,Map 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 {

@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 lastSortConnect, BaseAdapter adapter, Map 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为空~~~");

}

}

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值