先看效果图:
ListView里有数字、字母、汉字
目录结构:
MainActivity
public class MainActivity extends Activity implements OnClickListener {
private ListView listView;
private EditText etSearch;
private ImageView ivClearText;
private List<SortModel> list;
private CharacterParser characterParser;// 汉字转换成拼音的类
private PinyinComparator pinyinComparator;// 根据拼音来排列ListView里面的数据类
private ContactsSortAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
characterParser = CharacterParser.getInstance();
pinyinComparator = new PinyinComparator();
listView = (ListView) findViewById(R.id.listView);
etSearch=(EditText) findViewById(R.id.et_search);
ivClearText=(ImageView) findViewById(R.id.ivClearText);
initData();
Collections.sort(list, pinyinComparator);// 根据a-z进行排序源数据
adapter = new ContactsSortAdapter(MainActivity.this,list);
listView.setAdapter(adapter);
initListener();
}
private void initListener() {
// TODO Auto-generated method stub
etSearch.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
etSearch.setFocusable(true);
etSearch.setFocusableInTouchMode(true);
etSearch.requestFocus();// 获得焦点,弹出软键盘
InputMethodManager imm = (InputMethodManager) etSearch.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(etSearch, 0);
if (etSearch.getText().toString() != null) {
ivClearText.setVisibility(View.VISIBLE);
}
}
});
/** 清除输入字符 **/
ivClearText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
etSearch.setText("");
}
});
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
String content=etSearch.getText().toString();
if("".equals(content)){
ivClearText.setVisibility(View.INVISIBLE);
}else{
ivClearText.setVisibility(View.VISIBLE);
}
if(content.length()>0){
ArrayList<SortModel> filterList=(ArrayList<SortModel>) search(content);
adapter.updateListView(filterList);
}else{
adapter.updateListView(list);
}
listView.setSelection(0);
}
});
}
private void initData() {
// TODO Auto-generated method stub
list = new ArrayList<SortModel>();
list.add(new SortModel("12"));
list.add(new SortModel("122"));
list.add(new SortModel("171"));
list.add(new SortModel("13"));
list.add(new SortModel("108"));
list.add(new SortModel("21"));
list.add(new SortModel("81"));
list.add(new SortModel("25"));
list.add(new SortModel("86"));
list.add(new SortModel("28"));
list.add(new SortModel("11"));
list.add(new SortModel("10"));
list.add(new SortModel("65"));
list.add(new SortModel("cd"));
list.add(new SortModel("看看"));
list.add(new SortModel("悲伤"));
list.add(new SortModel("啊凉"));
list.add(new SortModel("额痛"));
list.add(new SortModel("我悲"));
list.add(new SortModel("方法"));
list.add(new SortModel("刚刚"));
list.add(new SortModel("呵呵"));
list.add(new SortModel("姐姐"));
list.add(new SortModel("c21"));
list.add(new SortModel("ad"));
list.add(new SortModel("c95"));
list.add(new SortModel("cd"));
list.add(new SortModel("c87"));
list.add(new SortModel("fd"));
list.add(new SortModel("c67"));
list.add(new SortModel("d2"));
list.add(new SortModel("哈哈"));
list.add(new SortModel("流量"));
list.add(new SortModel("嘻嘻"));
list.add(new SortModel("慢慢"));
list.add(new SortModel("没有"));
list.add(new SortModel("奶奶"));
list.add(new SortModel("唉"));
list.add(new SortModel("玩玩"));
list.add(new SortModel("踢求"));
list.add(new SortModel("请求"));
list.add(new SortModel("上午"));
list.add(new SortModel("哦哦"));
list.add(new SortModel("悲伤"));
list.add(new SortModel("啊凉"));
list.add(new SortModel("122"));
list.add(new SortModel("208"));
list.add(new SortModel("471"));
list.add(new SortModel("512"));
list.add(new SortModel("很久很久"));
list.add(new SortModel("哦哦"));
list.add(new SortModel("嗯嗯"));
list.add(new SortModel("屁屁"));
for (SortModel model : list) {
String sortLetters = getSortLetter(model.name);
Log.e("+++", sortLetters);
model.sortLetters = sortLetters;
String sortKey = getPingYin(model.name);
model.sortToken = parseSortKey(sortKey);
model.setSortLetters(sortLetters);
}
}
/**
* 搜索过滤
* @param str
* @return
*/
public List<SortModel> search(String str) {
List<SortModel> filterList = new ArrayList<SortModel>();// 过滤后的list
if (str.matches("^([0-9]|[/+]).*")) { // // 正则表达式
// 匹配以数字或者加号开头的字符串(包括了带空格及-分割的号码)
String simpleStr = str.replaceAll("\\-|\\s", "");
// initData();// 数据源
for (SortModel contacts : list) {
if (contacts.name != null) {
if (contacts.name.contains(simpleStr)
|| contacts.name.contains(str)) {
if (!filterList.contains(contacts)) {
filterList.add(contacts);
}
}
}
}
} else {
// initData();// 数据源
for (SortModel contact : list) {
if (contact.name != null) {
// 姓名全匹配,姓名首字母简拼匹配,姓名全字母匹配
if (contact.name.toLowerCase(Locale.CHINESE).contains(
str.toLowerCase(Locale.CHINESE))
|| contact.sortToken.simpleSpell.toLowerCase(
Locale.CHINESE).contains(
str.toLowerCase(Locale.CHINESE))
|| contact.sortToken.wholeSpell.toLowerCase(
Locale.CHINESE).contains(
str.toLowerCase(Locale.CHINESE))) {
if (!filterList.contains(contact)) {
filterList.add(contact);
}
}
}
}
}
return filterList;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 名字转拼音,取首字母
*
* @param name
* @return
*/
private String getSortLetter(String name) {
String letter = "#";
if (name == null) {
return letter;
}
// 汉字转换成拼音
String pinyin = characterParser.getSelling(name);
String sortString = pinyin.substring(0, 1).toUpperCase(Locale.CHINESE);
// 正则表达式,判断首字母是否是英文字母
if (sortString.matches("[A-Z]")) {
letter = sortString.toUpperCase(Locale.CHINESE);
}
return letter;
}
String chReg = "[\\u4E00-\\u9FA5]+";// 中文字符串匹配
/**
* 解析sort_key,封装简拼,全拼
*
* @param sortKey
* @return
*/
public SortToken parseSortKey(String sortKey) {
SortToken token = new SortToken();
if (sortKey != null && sortKey.length() > 0) {
// 其中包含的中文字符
String[] enStrs = sortKey.replace(" ", "").split(chReg);
for (int i = 0, length = enStrs.length; i < length; i++) {
if (enStrs[i].length() > 0) {
// 拼接简拼
token.simpleSpell += enStrs[i].charAt(0);
token.wholeSpell += enStrs[i];
}
}
}
return token;
}
/**
* 将字符串中的中文转化为拼音,其他字符不变
*
* @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;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
`
拼音排序类PinyinComparator
public class PinyinComparator implements Comparator<SortModel> {
private String str1, str2;
private int pos1, pos2, len1, len2;
public int compare(SortModel o1, SortModel o2) {
if (o1.sortLetters.equals("#") && o2.sortLetters.equals("#")) { //对数字排序
str1 = o1.getName();
str2 = o2.getName();
len1 = str1.length();
len2 = str2.length();
pos1 = pos2 = 0;
int result = 0;
while (result == 0 && pos1 < len1 && pos2 < len2) {
char ch1 = str1.charAt(pos1);
char ch2 = str2.charAt(pos2);
if (Character.isDigit(ch1)) {
result = Character.isDigit(ch2) ? compareNumbers() : -1;
} else if (Character.isLetter(ch1)) {
result = Character.isLetter(ch2) ? compareOther(true) : 1;
} else {
result = Character.isDigit(ch2) ? 1 : Character
.isLetter(ch2) ? -1 : compareOther(false);
}
pos1++;
pos2++;
}
return result == 0 ? len1 - len2 : result;
}else if (o1.sortLetters.equals("@") || o2.sortLetters.equals("#")) {
return -1;
} else if (o1.sortLetters.equals("#") || o2.sortLetters.equals("@")) {
return 1;
} else { //对汉字排序,取得汉字的首字母
return o1.sortLetters.compareTo(o2.sortLetters);
}
}
private int compareNumbers() {
int end1 = pos1 + 1;
while (end1 < len1 && Character.isDigit(str1.charAt(end1))) {
end1++;
}
int fullLen1 = end1 - pos1;
while (pos1 < end1 && str1.charAt(pos1) == '0') {
pos1++;
}
int end2 = pos2 + 1;
while (end2 < len2 && Character.isDigit(str2.charAt(end2))) {
end2++;
}
int fullLen2 = end2 - pos2;
while (pos2 < end2 && str2.charAt(pos2) == '0') {
pos2++;
}
int delta = (end1 - pos1) - (end2 - pos2);
if (delta != 0) {
return delta;
}
while (pos1 < end1 && pos2 < end2) {
delta = str1.charAt(pos1++) - str2.charAt(pos2++);
if (delta != 0) {
return delta;
}
}
pos1--;
pos2--;
return fullLen2 - fullLen1;
}
private int compareOther(boolean isLetters) {
char ch1 = str1.charAt(pos1);
char ch2 = str2.charAt(pos2);
if (ch1 == ch2) {
return 0;
}
if (isLetters) {
ch1 = Character.toUpperCase(ch1);
ch2 = Character.toUpperCase(ch2);
if (ch1 != ch2) {
ch1 = Character.toLowerCase(ch1);
ch2 = Character.toLowerCase(ch2);
}
}
return ch1 - ch2;
}
}
还有的不贴了,下载传送门