Android对象封装及按汉语拼音排序
项目中用到对私信联系人排序,因为从服务器获取到的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);