ListView列表项数字/字母/汉字混合排序

先看效果图:
这里写图片描述
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;
    }

}

还有的不贴了,下载传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值