先上个图, 只实现了排序 以及加分割线, 那个提示,以及右边一个竖条字母定位没实现。 代码是借鉴别人的弄出来的
bug,是多音字没处理~
PingYinUtil.java 获取拼音
public class PingYinUtil {
/**
*
* @param inputString
* @return
*/
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.trim().toCharArray();
String output = "";
try {
for (int i = 0; i < input.length; i++) {
if (java.lang.Character.toString(input[i]).
matches("[\\u4E00-\\u9FA5]+")) {
String[] temp = PinyinHelper.
toHanyuPinyinStringArray(input[i],
format);
output += temp[0];
} else
output += java.lang.Character.toString(
input[i]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return output;
}
}
PinyinComparator.java 比较排序
/**
* 只是判断了为""的时候,放到最前面,
* 假如需要判断 符号,半角 全角,可以用正则表达式
*
* @author zeng
*
*
* 正则表达式 如下:
* 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
* 只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
* 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
* !!!-> 结束符号 $ 开始符号 ^
*/
public class PinyinComparator implements Comparator<TestSortItem> {
@Override
public int compare(TestSortItem o1, TestSortItem o2) {
// TODO Auto-generated method stub
String py1 = o1.getPinyin();
String py2 = o2.getPinyin();
// 判断是否为空""
if (isEmpty(py1) && isEmpty(py2))
return 0;
if (isEmpty(py1))
return -1;
if (isEmpty(py2))
return 1;
String str1 = "";
String str2 = "";
try {
str1 = ((o1.getPinyin()).toUpperCase()).substring(0, 1);
str2 = ((o2.getPinyin()).toUpperCase()).substring(0, 1);
} catch (Exception e) {
// TODO: handle exception
System.out.println("某个str为\" \" 空");
}
return str1.compareTo(str2);
}
private boolean isEmpty(String str) {
return "".equals(str.trim());
}
}
obj
public class TestSortItem {
private String name;
private Object other = "test";
private String pinyin;
ContactAdapter
public class ContactAdapter extends MyBaseAdapter<TestSortItem> {
public ContactAdapter(Context context, List<TestSortItem> list) {
super(context, list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder vh = null;
if (convertView == null) {
vh = new ViewHolder();
convertView = inflater.inflate(R.layout.friendlist_item_semis, null);
vh.firstCharHint = (TextView) convertView.findViewById(R.id.text_first_char_hint);
vh.name = (TextView) convertView.findViewById(R.id.name);
vh.sign = (TextView) convertView.findViewById(R.id.sign);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
TestSortItem item = data.get(position);
char previewChar = ' ';
char currentChar = ' ';
try {
int idx = position - 1;
previewChar = (idx >= 0 ? data.get(idx).getPinyin().charAt(0) : ' ');
currentChar = item.getPinyin().charAt(0);
} catch (Exception e) {
// TODO: handle exception
System.out.println(" 防止某个为\"\" 空,报错");
}
if (currentChar != previewChar) {
if (isLetter(item.getPinyin())) {
vh.firstCharHint.setVisibility(View.VISIBLE);
vh.firstCharHint.setText(String.valueOf(currentChar));
} else {
vh.firstCharHint.setVisibility(View.GONE);
}
} else {
// 实例化一个CurrentView后,会被多次赋值并且只有最后一次赋值的position是正确
vh.firstCharHint.setVisibility(View.GONE);
}
vh.name.setText(item.getName());
vh.sign.setText(item.getOther().toString());
return convertView;
}
private class ViewHolder {
private TextView name;
private TextView sign;
private TextView firstCharHint;
}
// private boolean isNum(char c) {
// if (java.lang.Character.isDigit(c)) {
// return true;
// }
// return false;
// }
//
// private static boolean isLetter1111(String str) {
// java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("[a-zA-Z]+");
// java.util.regex.Matcher m = pattern.matcher(str);
// return m.matches();
// }
/**
* 仅判断首字母
*
* @param str
* @return
*/
private static boolean isLetter(String str) {
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^[a-zA-Z]+");
java.util.regex.Matcher m = pattern.matcher(str);
return m.matches();
}
}
MyBaseAdapter<T> 这个只是我为了 少写那几个经常重复重写的方法,getCount()...等。
public abstract class MyBaseAdapter<T> extends BaseAdapter {
protected List<T> data;
protected Context mContext;
protected LayoutInflater inflater;
public MyBaseAdapter(Context context, List<T> list) {
// TODO Auto-generated constructor stub
this.mContext = context;
this.data = list;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void refreshList(List<T> list) {
// for(int i = 0; i<list.size(); i++){
// data.add(list.get(i));
// }
this.data = list;
notifyDataSetChanged();
}
activity
originalData = new ArrayList<TestSortItem>();
initTestData();
for (TestSortItem item : originalData) {
item.setPinyin(PingYinUtil.getPingYin(item.getName().toString()));
System.out.println("拼音 => " + item.getPinyin());
}
Collections.sort(originalData, new PinyinComparator());
// 排序完后,看排序的list,
for (TestSortItem item : originalData)
System.out.println("排序==> " + item.getName().toString());
//
adapter = new ContactAdapter(this, originalData);
mListView.setAdapter(adapter);