项目中用到对私信联系人排序,因为从服务器获取到的ArrayList联系人信息包括姓名,心情,头像等,所以根据姓名排序后还需要考虑跟心情,头像等的对应。
有两种思路:
1. 把联系人信息封装成一个类,对联系人对象根据姓名排序,用到头像等信息的时候,用get方法获取。
2. 从服务器获取到的ArrayList拆分后,在姓名上加上id,排序之后根据id查找对应的其他信息。
我采用的是第一种方法,具体实现如下:
联系人类:
/**
* 联系人对象
*
*/
public class Contact {
String nickName;
String letter;
String headUrl;
public Contact(int uId, String nickName, String letter, String headUrl) {
this.nickName = nickName;
this.letter = letter;
this.headUrl = headUrl;
}
public String getNickName() {
return nickName;
}
public void setNickName() {
this.nickName = nickName;
}
public String getLetter() {
return letter;
}
public void setLetter() {
this.letter = letter;
}
public String getHeadUrl() {
return headUrl;
}
public void setHeadUrl() {
this.headUrl = headUrl;
}
}
MyAdapter类:显示联系人信息使用ListView,需要重写BaceAdapter类
// 排序(实现了中英文混排)
PinyinComparator comparator = new PinyinComparator();
Collections.sort(mContactList, comparator);
联系人姓名可能包括大写字母,小写字母,汉字,特殊字符,这里需要统一处理成汉语拼音
public class PinyinComparator implements Comparator {
/**
* 比较两个字符串
*/
@Override
public int compare(Object o1, Object o2) {
Contact contact1 = (Contact) o1;
Contact contact2 = (Contact) o2;
String str1 = getPingYin(contact1.getNickName());
String str2 = getPingYin(contact2.getNickName());
int flag = str1.compareTo(str2);
return flag;
}
/**
* 将字符串中的中文转化为拼音,其他字符不变
*
* @param inputString
* @return
*/
private 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.trim().toCharArray();// 把字符串转化成字符数组
String output = "";
try {
for (int i = 0; i < input.length; i++) {
// \\u4E00是unicode编码,判断是不是中文
if (java.lang.Character.toString(input[i]).matches(
"[\\u4E00-\\u9FA5]+")) {
// 将汉语拼音的全拼存到temp数组
String[] temp = PinyinHelper.toHanyuPinyinStringArray(
input[i], format);
// 取拼音的第一个读音
output += temp[0];
}
// 大写字母转化成小写字母
else if (input[i] > 'A' && input[i] < 'Z') {
output += java.lang.Character.toString(input[i]);
output = output.toLowerCase();
}
output += java.lang.Character.toString(input[i]);
}
} catch (Exception e) {
Log.e("Exception", e.toString());
}
return output;
}
}
ContactActivity类:
在Activity中定义存放数据的List,并初始化:
private List contactList;// 把联系人信息封装成对象,放到List中,传递给适配器
contactList = new ArrayList();
private MyContactAdapter mContactAdapter;// 联系人适配器
private ListView mListViewContact;// 联系人列表
初始化控件:
mListViewContact = (ListView)findViewById(R.id.listview_contact);
封装对象:
// 把联系人信息封装成对象
contactList.add(new Contact(friendId, friendname,letter, friendhead));
传递数据:
mContactAdapter = new MyrContactAdapter(this, contactList);
mListViewContact.setAdapter(mContactAdapter);
参考:http://jiake.iteye.com/blog/207038