Android 实现ListView的A-Z字…

转自:http://blog.csdn.net/xiaanming/article/details/12684155

前段时间因为换工作的缘故又恰巧碰到国庆节,所以有段时间自己没有更新博客了,过完国庆到新公司报道,感觉还不错,就是现在住的地方离新公司有点远,地铁20站,伤不起啊,我每天早上7点多就要起床,然后屁颠屁颠的去挤地铁上班,晚上下班还要挤地铁,先不说路程远,车费一天就要10几块,我的银子啊,有坐龙华线去上班的深圳程序员不?听说那条线上班高峰期很挤?我没在上班高峰期坐过那趟车,我在民治那边找了个房子,离华强北也不远,关键房租便宜,哈哈,乐开花了,下个礼拜就要搬过去啦

不扯了,回到主题,今天给大家带来ListView的A-Z字母排序和过滤搜索功能并且实现汉字转成拼音的功能,我们知道一般我们对联系人,城市列表等实现A-Z的排序,因为联系人和城市列表我们可以直接从数据库中获取他的汉字拼音,而对于一般的数据,我们怎么实现A-Z的排序,我们需要将汉字转换成拼音就行了,接下来就带大家实现一般数据的A-Z排序功能,首先先看下效果图



上面是一个带删除按钮的EditText,我们在输入框中输入可以自动过滤出我们想要的东西,当输入框中没有数据自动替换到原来的数据列表,然后下面一个ListView用来显示数据列表,右侧是一个字母索引表,当我们点击不同的字母,ListView会定位到该字母地方,了解了布局之后,我们先看下项目结构吧


我按照项目中类的顺序来一一介绍其功能

1.SortModel一个实体类,里面一个是ListView的name,另一个就是显示的name拼音的首字母

 

  1. package com.example.sortlistview;  
  2.   
  3. public class SortModel  
  4.   
  5.     private String name;   //显示的数据  
  6.     private String sortLetters;  //显示数据拼音的首字母  
  7.       
  8.     public String getName()  
  9.         return name;  
  10.      
  11.     public void setName(String name)  
  12.         this.name name;  
  13.      
  14.     public String getSortLetters()  
  15.         return sortLetters;  
  16.      
  17.     public void setSortLetters(String sortLetters)  
  18.         this.sortLetters sortLetters;  
  19.      
  20.  
package com.example.sortlistview;

public class SortModel {

        private String name;   //显示的数据
        private String sortLetters;  //显示数据拼音的首字母
        
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getSortLetters() {
                return sortLetters;
        }
        public void setSortLetters(String sortLetters) {
                this.sortLetters = sortLetters;
        }
}

2.SideBar类就是ListView右侧的字母索引View,我们需要使用setTextView(TextViewmTextDialog)来设置用来显示当前按下的字母的TextView,以及使用setOnTouchingLetterChangedListener方法来设置回调接口,在回调方法onTouchingLetterChanged(Strings)中来处理不同的操作

 

  1. package com.example.sortlistview;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Typeface;  
  8. import android.graphics.drawable.ColorDrawable;  
  9. import android.util.AttributeSet;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.widget.TextView;  
  13.   
  14. public class SideBar extends View  
  15.     // 触摸事件  
  16.     private OnTouchingLetterChangedListener onTouchingLetterChangedListener;  
  17.     // 26个字母  
  18.     public static String[] "A", "B", "C", "D", "E", "F", "G", "H", "I",  
  19.             "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",  
  20.             "W", "X", "Y", "Z", "#" };  
  21.     private int choose -1;// 选中  
  22.     private Paint paint new Paint();  
  23.   
  24.     private TextView mTextDialog;  
  25.   
  26.       
  27.     public void setTextView(TextView mTextDialog)  
  28.         this.mTextDialog mTextDialog;  
  29.      
  30.   
  31.   
  32.     public SideBar(Context context, AttributeSet attrs, int defStyle)  
  33.         super(context, attrs, defStyle);  
  34.      
  35.   
  36.     public SideBar(Context context, AttributeSet attrs)  
  37.         super(context, attrs);  
  38.      
  39.   
  40.     public SideBar(Context context)  
  41.         super(context);  
  42.      
  43.   
  44.       
  45.     protected void onDraw(Canvas canvas)  
  46.         super.onDraw(canvas);  
  47.         // 获取焦点改变背景颜色.  
  48.         int height getHeight();// 获取对应高度  
  49.         int width getWidth(); // 获取对应宽度  
  50.         int singleHeight height b.length;// 获取每一个字母的高度  
  51.   
  52.         for (int 0; b.length; i++)  
  53.             paint.setColor(Color.rgb(33, 65, 98));  
  54.             // paint.setColor(Color.WHITE);  
  55.             paint.setTypeface(Typeface.DEFAULT_BOLD);  
  56.             paint.setAntiAlias(true);  
  57.             paint.setTextSize(20);  
  58.             // 选中的状态  
  59.             if (i == choose)  
  60.                 paint.setColor(Color.parseColor("#3399ff"));  
  61.                 paint.setFakeBoldText(true);  
  62.              
  63.             // x坐标等于中间-字符串宽度的一半.  
  64.             float xPos width paint.measureText(b[i]) 2;  
  65.             float yPos singleHeight singleHeight;  
  66.             canvas.drawText(b[i], xPos, yPos, paint);  
  67.             paint.reset();// 重置画笔  
  68.          
  69.   
  70.      
  71.   
  72.     @Override  
  73.     public boolean dispatchTouchEvent(MotionEvent event)  
  74.         final int action event.getAction();  
  75.         final float event.getY();// 点击y坐标  
  76.         final int oldChoose choose;  
  77.         final OnTouchingLetterChangedListener listener onTouchingLetterChangedListener;  
  78.         final int (int) (y getHeight() b.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.  
  79.   
  80.         switch (action)  
  81.         case MotionEvent.ACTION_UP:  
  82.             setBackgroundDrawable(new ColorDrawable(0x00000000));  
  83.             choose -1;//  
  84.             invalidate();  
  85.             if (mTextDialog != null)  
  86.                 mTextDialog.setVisibility(View.INVISIBLE);  
  87.              
  88.             break;  
  89.   
  90.         default:  
  91.             setBackgroundResource(R.drawable.sidebar_background);  
  92.             if (oldChoose != c)  
  93.                 if (c >= && b.length)  
  94.                     if (listener != null)  
  95.                         listener.onTouchingLetterChanged(b[c]);  
  96.                      
  97.                     if (mTextDialog != null)  
  98.                         mTextDialog.setText(b[c]);  
  99.                         mTextDialog.setVisibility(View.VISIBLE);  
  100.                      
  101.                       
  102.                     choose c;  
  103.                     invalidate();  
  104.                  
  105.              
  106.   
  107.             break;  
  108.          
  109.         return true;  
  110.      
  111.   
  112.       
  113.     public void setOnTouchingLetterChangedListener(  
  114.             OnTouchingLetterChangedListener onTouchingLetterChangedListener)  
  115.         this.onTouchingLetterChangedListener onTouchingLetterChangedListener;  
  116.      
  117.   
  118.       
  119.     public interface OnTouchingLetterChangedListener  
  120.         public void onTouchingLetterChanged(String s);  
  121.      
  122.   
  123.  
package com.example.sortlistview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

public class SideBar extends View {
        // 触摸事件
        private OnTouchingLetterChangedL<wbr>istener onTouchingLetterChangedL<wbr>istener;
        // 26个字母
        public static String[] b = { "A", "B", "C", "D", "E", "F", "G", "H", "I",
                        "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
                        "W", "X", "Y", "Z", "#" };
        private int choose = -1;// 选中
        private Paint paint = new Paint();

        private TextView mTextDialog;

        
        public void setTextView(TextView mTextDialog) {
                this.mTextDialog = mTextDialog;
        }


        public SideBar(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);
        }

        public SideBar(Context context, AttributeSet attrs) {
                super(context, attrs);
        }

        public SideBar(Context context) {
                super(context);
        }

        
        protected void onDraw(Canvas canvas) {
                super.onDraw(canvas);
                // 获取焦点改变背景颜色.
                int height = getHeight();// 获取对应高度
                int width = getWidth(); // 获取对应宽度
                int singleHeight = height / b.length;// 获取每一个字母的高度

                for (int i = 0; i < b.length; i++) {
                        paint.setColor(Color.rgb(33, 65, 98));
                        // paint.setColor(Color.WHITE);
                        paint.setTypeface(Typeface.DEFAULT_BOLD);
                        paint.setAntiAlias(true);
                        paint.setTextSize(20);
                        // 选中的状态
                        if (i == choose) {
                                paint.setColor(Color.parseColor("#3399ff"));
                                paint.setFakeBoldText(true);
                        }
                        // x坐标等于中间-字符串宽度的一半.
                        float xPos = width / 2 - paint.measureText(b[i]) / 2;
                        float yPos = singleHeight * i + singleHeight;
                        canvas.drawText(b[i], xPos, yPos, paint);
                        paint.reset();// 重置画笔
                }

        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
                final int action = event.getAction();
                final float y = event.getY();// 点击y坐标
                final int oldChoose = choose;
                final OnTouchingLetterChangedL<wbr>istener listener = onTouchingLetterChangedL<wbr>istener;
                final int c = (int) (y / getHeight() * b.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.

                switch (action) {
                case MotionEvent.ACTION_UP:
                        setBackgroundDrawable(new ColorDrawable(0x00000000));
                        choose = -1;//
                        invalidate();
                        if (mTextDialog != null) {
                                mTextDialog.setVisibility(View.INVISIBLE);
                        }
                        break;

                default:
                        setBackgroundResource(R.drawable.sidebar_background);
                        if (oldChoose != c) {
                                if (c >= 0 && c < b.length) {
                                        if (listener != null) {
                                                listener.onTouchingLetterChanged(b[c]);
                                        }
                                        if (mTextDialog != null) {
                                                mTextDialog.setText(b[c]);
                                                mTextDialog.setVisibility(View.VISIBLE);
                                        }
                                        
                                        choose = c;
                                        invalidate();
                                }
                        }

                        break;
                }
                return true;
        }

        
        public void setOnTouchingLetterChang<wbr>edListener(
                        OnTouchingLetterChangedL<wbr>istener onTouchingLetterChangedL<wbr>istener) {
                this.onTouchingLetterChangedL<wbr>istener = onTouchingLetterChangedL<wbr>istener;
        }

        
        public interface OnTouchingLetterChangedL<wbr>istener {
                public void onTouchingLetterChanged(String s);
        }

}
</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

3.CharacterParser 这个类是将汉字转换成拼音的类,该拼音没有声调的,该类是单例类,其中定义了三个方法,在这个demo中用到的是getSelling(Stringchs)方法,将词组转换成拼音

 

  1. package com.example.sortlistview;  
  2.   
  3.   
  4. public class CharacterParser  
  5.     private static int[] pyvalue new int[] {-20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032,  
  6.             -20026, -20002, -19990, -19986, -19982, -19976, -19805, -19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741, -19739, -19728,  
  7.             -19725, -19715, -19540, -19531, -19525, -19515, -19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275, -19270, -19263, -19261,  
  8.             -19249, -19243, -19242, -19238, -19235, -19227, -19224, -19218, -19212, -19038, -19023, -19018, -19006, -19003, -18996, -18977, -18961,  
  9.             -18952, -18783, -18774, -18773, -18763, -18756, -18741, -18735, -18731, -18722, -18710, -18697, -18696, -18526, -18518, -18501, -18490,  
  10.             -18478, -18463, -18448, -18447, -18446, -18239, -18237, -18231, -18220, -18211, -18201, -18184, -18183, -18181, -18012, -17997, -17988,  
  11.             -17970, -17964, -17961, -17950, -17947, -17931, -17928, -17922, -17759, -17752, -17733, -17730, -17721, -17703, -17701, -17697, -17692,  
  12.             -17683, -17676, -17496, -17487, -17482, -17468, -17454, -17433, -17427, -17417, -17202, -17185, -16983, -16970, -16942, -16915, -16733,  
  13.             -16708, -16706, -16689, -16664, -16657, -16647, -16474, -16470, -16465, -16459, -16452, -16448, -16433, -16429, -16427, -16423, -16419,  
  14.             -16412, -16407, -16403, -16401, -16393, -16220, -16216, -16212, -16205, -16202, -16187, -16180, -16171, -16169, -16158, -16155, -15959,  
  15.             -15958, -15944, -15933, -15920, -15915, -15903, -15889, -15878, -15707, -15701, -15681, -15667, -15661, -15659, -15652, -15640, -15631,  
  16.             -15625, -15454, -15448, -15436, -15435, -15419, -15416, -15408, -15394, -15385, -15377, -15375, -15369, -15363, -15362, -15183, -15180,  
  17.             -15165, -15158, -15153, -15150, -15149, -15144, -15143, -15141, -15140, -15139, -15128, -15121, -15119, -15117, -15110, -15109, -14941,  
  18.             -14937, -14933, -14930, -14929, -14928, -14926, -14922, -14921, -14914, -14908, -14902, -14894, -14889, -14882, -14873, -14871, -14857,  
  19.             -14678, -14674, -14670, -14668, -14663, -14654, -14645, -14630, -14594, -14429, -14407, -14399, -14384, -14379, -14368, -14355, -14353,  
  20.             -14345, -14170, -14159, -14151, -14149, -14145, -14140, -14137, -14135, -14125, -14123, -14122, -14112, -14109, -14099, -14097, -14094,  
  21.             -14092, -14090, -14087, -14083, -13917, -13914, -13910, -13907, -13906, -13905, -13896, -13894, -13878, -13870, -13859, -13847, -13831,  
  22.             -13658, -13611, -13601, -13406, -13404, -13400, -13398, -13395, -13391, -13387, -13383, -13367, -13359, -13356, -13343, -13340, -13329,  
  23.             -13326, -13318, -13147, -13138, -13120, -13107, -13096, -13095, -13091, -13076, -13068, -13063, -13060, -12888, -12875, -12871, -12860,  
  24.             -12858, -12852, -12849, -12838, -12831, -12829, -12812, -12802, -12607, -12597, -12594, -12585, -12556, -12359, -12346, -12320, -12300,  
  25.             -12120, -12099, -12089, -12074, -12067, -12058, -12039, -11867, -11861, -11847, -11831, -11798, -11781, -11604, -11589, -11536, -11358,  
  26.             -11340, -11339, -11324, -11303, -11097, -11077, -11067, -11055, -11052, -11045, -11041, -11038, -11024, -11020, -11019, -11018, -11014,  
  27.             -10838, -10832, -10815, -10800, -10790, -10780, -10764, -10587, -10544, -10533, -10519, -10331, -10329, -10328, -10322, -10315, -10309,  
  28.             -10307, -10296, -10281, -10274, -10270, -10262, -10260, -10256, -10254};  
  29.     public static String[] pystr new String[] {"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian",  
  30.             "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "ceng", "cha", "chai", "chan", "chang", "chao", "che",  
  31.             "chen", "cheng", "chi", "chong", "chou", "chu", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan",  
  32.             "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du",  
  33.             "duan", "dui", "dun", "duo", "e", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",  
  34.             "gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang",  
  35.             "hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian",  
  36.             "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken",  
  37.             "keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng",  
  38.             "li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "lv", "luan", "lue", "lun", "luo", "ma", "mai",  
  39.             "man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai",  
  40.             "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nu", "nv", "nuan",  
  41.             "nue", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pu",  
  42.             "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re",  
  43.             "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha",  
  44.             "shai", "shan", "shang", "shao", "she", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun",  
  45.             "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao",  
  46.             "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi",  
  47.             "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi",  
  48.             "yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha",  
  49.             "zhai", "zhan", "zhang", "zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui",  
  50.             "zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"};  
  51.     private StringBuilder buffer;  
  52.     private String resource;  
  53.     private static CharacterParser characterParser new CharacterParser();  
  54.   
  55.     public static CharacterParser getInstance()  
  56.         return characterParser;  
  57.      
  58.   
  59.     public String getResource()  
  60.         return resource;  
  61.      
  62.   
  63.     public void setResource(String resource)  
  64.         this.resource resource;  
  65.      
  66.   
  67.       
  68.     private int getChsAscii(String chs)  
  69.         int asc 0;  
  70.         try  
  71.             byte[] bytes chs.getBytes("gb2312");  
  72.             if (bytes == null || bytes.length || bytes.length <= 0)  
  73.                 throw new RuntimeException("illegal resource string");  
  74.              
  75.             if (bytes.length == 1)  
  76.                 asc bytes[0];  
  77.              
  78.             if (bytes.length == 2)  
  79.                 int hightByte 256 bytes[0];  
  80.                 int lowByte 256 bytes[1];  
  81.                 asc (256 hightByte lowByte) 256 256;  
  82.              
  83.         catch (Exception e)  
  84.             System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" e);  
  85.          
  86.         return asc;  
  87.      
  88.   
  89.       
  90.     public String convert(String str)  
  91.         String result null;  
  92.         int ascii getChsAscii(str);  
  93.         if (ascii && ascii 160)  
  94.             result String.valueOf((char) ascii);  
  95.         else  
  96.             for (int (pyvalue.length 1); >= 0; i--)  
  97.                 if (pyvalue[i] <= ascii)  
  98.                     result pystr[i];  
  99.                     break;  
  100.                  
  101.              
  102.          
  103.         return result;  
  104.      
  105.   
  106.       
  107.     public String getSelling(String chs)  
  108.         String key, value;  
  109.         buffer new StringBuilder();  
  110.         for (int 0; chs.length(); i++)  
  111.             key chs.substring(i, 1);  
  112.             if (key.getBytes().length >= 2)  
  113.                 value (String) convert(key);  
  114.                 if (value == null)  
  115.                     value "unknown";  
  116.                  
  117.             else  
  118.                 value key;  
  119.              
  120.             buffer.append(value);  
  121.          
  122.         return buffer.toString();  
  123.      
  124.   
  125.     public String getSpelling()  
  126.         return this.getSelling(this.getResource());  
  127.      
  128.   
  129.  
package com.example.sortlistview;


public class CharacterParser {
        private static int[] pyvalue = new int[] {-20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032,
                        -20026, -20002, -19990, -19986, -19982, -19976, -19805, -19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741, -19739, -19728,
                        -19725, -19715, -19540, -19531, -19525, -19515, -19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275, -19270, -19263, -19261,
                        -19249, -19243, -19242, -19238, -19235, -19227, -19224, -19218, -19212, -19038, -19023, -19018, -19006, -19003, -18996, -18977, -18961,
                        -18952, -18783, -18774, -18773, -18763, -18756, -18741, -18735, -18731, -18722, -18710, -18697, -18696, -18526, -18518, -18501, -18490,
                        -18478, -18463, -18448, -18447, -18446, -18239, -18237, -18231, -18220, -18211, -18201, -18184, -18183, -18181, -18012, -17997, -17988,
                        -17970, -17964, -17961, -17950, -17947, -17931, -17928, -17922, -17759, -17752, -17733, -17730, -17721, -17703, -17701, -17697, -17692,
                        -17683, -17676, -17496, -17487, -17482, -17468, -17454, -17433, -17427, -17417, -17202, -17185, -16983, -16970, -16942, -16915, -16733,
                        -16708, -16706, -16689, -16664, -16657, -16647, -16474, -16470, -16465, -16459, -16452, -16448, -16433, -16429, -16427, -16423, -16419,
                        -16412, -16407, -16403, -16401, -16393, -16220, -16216, -16212, -16205, -16202, -16187, -16180, -16171, -16169, -16158, -16155, -15959,
                        -15958, -15944, -15933, -15920, -15915, -15903, -15889, -15878, -15707, -15701, -15681, -15667, -15661, -15659, -15652, -15640, -15631,
                        -15625, -15454, -15448, -15436, -15435, -15419, -15416, -15408, -15394, -15385, -15377, -15375, -15369, -15363, -15362, -15183, -15180,
                        -15165, -15158, -15153, -15150, -15149, -15144, -15143, -15141, -15140, -15139, -15128, -15121, -15119, -15117, -15110, -15109, -14941,
                        -14937, -14933, -14930, -14929, -14928, -14926, -14922, -14921, -14914, -14908, -14902, -14894, -14889, -14882, -14873, -14871, -14857,
                        -14678, -14674, -14670, -14668, -14663, -14654, -14645, -14630, -14594, -14429, -14407, -14399, -14384, -14379, -14368, -14355, -14353,
                        -14345, -14170, -14159, -14151, -14149, -14145, -14140, -14137, -14135, -14125, -14123, -14122, -14112, -14109, -14099, -14097, -14094,
                        -14092, -14090, -14087, -14083, -13917, -13914, -13910, -13907, -13906, -13905, -13896, -13894, -13878, -13870, -13859, -13847, -13831,
                        -13658, -13611, -13601, -13406, -13404, -13400, -13398, -13395, -13391, -13387, -13383, -13367, -13359, -13356, -13343, -13340, -13329,
                        -13326, -13318, -13147, -13138, -13120, -13107, -13096, -13095, -13091, -13076, -13068, -13063, -13060, -12888, -12875, -12871, -12860,
                        -12858, -12852, -12849, -12838, -12831, -12829, -12812, -12802, -12607, -12597, -12594, -12585, -12556, -12359, -12346, -12320, -12300,
                        -12120, -12099, -12089, -12074, -12067, -12058, -12039, -11867, -11861, -11847, -11831, -11798, -11781, -11604, -11589, -11536, -11358,
                        -11340, -11339, -11324, -11303, -11097, -11077, -11067, -11055, -11052, -11045, -11041, -11038, -11024, -11020, -11019, -11018, -11014,
                        -10838, -10832, -10815, -10800, -10790, -10780, -10764, -10587, -10544, -10533, -10519, -10331, -10329, -10328, -10322, -10315, -10309,
                        -10307, -10296, -10281, -10274, -10270, -10262, -10260, -10256, -10254};
        public static String[] pystr = new String[] {"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian",
                        "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "ceng", "cha", "chai", "chan", "chang", "chao", "che",
                        "chen", "cheng", "chi", "chong", "chou", "chu", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan",
                        "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du",
                        "duan", "dui", "dun", "duo", "e", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
                        "gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang",
                        "hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian",
                        "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken",
                        "keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng",
                        "li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "lv", "luan", "lue", "lun", "luo", "ma", "mai",
                        "man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai",
                        "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nu", "nv", "nuan",
                        "nue", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pu",
                        "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re",
                        "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha",
                        "shai", "shan", "shang", "shao", "she", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun",
                        "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao",
                        "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi",
                        "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi",
                        "yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha",
                        "zhai", "zhan", "zhang", "zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui",
                        "zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"};
        private StringBuilder buffer;
        private String resource;
        private static CharacterParser characterParser = new CharacterParser();

        public static CharacterParser getInstance() {
                return characterParser;
        }

        public String getResource() {
                return resource;
        }

        public void setResource(String resource) {
                this.resource = resource;
        }

        
        private int getChsAscii(String chs) {
                int asc = 0;
                try {
                        byte[] bytes = chs.getBytes("gb2312");
                        if (bytes == null || bytes.length > 2 || bytes.length <= 0) {
                                throw new RuntimeException("illegal resource string");
                        }
                        if (bytes.length == 1) {
                                asc = bytes[0];
                        }
                        if (bytes.length == 2) {
                                int hightByte = 256 + bytes[0];
                                int lowByte = 256 + bytes[1];
                                asc = (256 * hightByte + lowByte) - 256 * 256;
                        }
                } catch (Exception e) {
                        System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" + e);
                }
                return asc;
        }

        
        public String convert(String str) {
                String result = null;
                int ascii = getChsAscii(str);
                if (ascii > 0 && ascii < 160) {
                        result = String.valueOf((char) ascii);
                } else {
                        for (int i = (pyvalue.length - 1); i >= 0; i--) {
                                if (pyvalue[i] <= ascii) {
                                        result = pystr[i];
                                        break;
                                }
                        }
                }
                return result;
        }

        
        public String getSelling(String chs) {
                String key, value;
                buffer = new StringBuilder();
                for (int i = 0; i < chs.length(); i++) {
                        key = chs.substring(i, i + 1);
                        if (key.getBytes().length >= 2) {
                                value = (String) convert(key);
                                if (value == null) {
                                        value = "unknown";
                                }
                        } else {
                                value = key;
                        }
                        buffer.append(value);
                }
                return buffer.toString();
        }

        public String getSpelling() {
                return this.getSelling(this.getResource());
        }

}


4.ClearEditText类是自定义的一个在右侧有删除图片的EditText,当然你也可以用Android原生的EditText,该类我之前有介绍,我这里就不贴上代码了Android带清除功能的输入框控件ClearEditText,仿IOS的输入框


5.SortAdapter数据的适配器类,该类需要实现SectionIndexer接口,该接口是用来控制ListView分组的,该接口有三个方法getSectionForPosition(intposition),getPositionForSection(intsection),getSections(),我们只需要自行实现前面两个方法

 

  • getSectionForPosition(intposition)是根据ListView的position来获取该位置上面的name的首字母char的ascii值,例如:如果该position上面的name是阿妹,首字母就是A,那么此方法返回的就是'A'字母的ascii值,也就是65,'B'是66,依次类推
  • getPositionForSection(intsection)就是根据首字母的ascii值来获取在该ListView中第一次出现该首字母的位置,例如:从上面的效果图1中,如果section是66 ,也就是‘B’的ascii值,那么该方法返回的position就是2

然后就是getView()方法,首先我们根据ListView的position调用getSectionForPosition(intposition)来获取该位置上面name的首字母的ascii值,然后根据这个ascii值调用getPositionForSection(intsection)来获取第一次出现该首字母的position,如果ListView的position等于 根据这个ascii值调用getPositionForSection(intsection)来获取第一次出现该首字母的position,则显示分类字母 否则隐藏

 

  1. package com.example.sortlistview;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.SectionIndexer;  
  11. import android.widget.TextView;  
  12.   
  13. public class SortAdapter extends BaseAdapter implements SectionIndexer{  
  14.     private List list null;  
  15.     private Context mContext;  
  16.       
  17.     public SortAdapter(Context mContext, List list)  
  18.         this.mContext mContext;  
  19.         this.list list;  
  20.      
  21.       
  22.       
  23.     public void updateListView(List list){  
  24.         this.list list;  
  25.         notifyDataSetChanged();  
  26.      
  27.   
  28.     public int getCount()  
  29.         return this.list.size();  
  30.      
  31.   
  32.     public Object getItem(int position)  
  33.         return list.get(position);  
  34.      
  35.   
  36.     public long getItemId(int position)  
  37.         return position;  
  38.      
  39.   
  40.     public View getView(final int position, View view, ViewGroup arg2)  
  41.         ViewHolder viewHolder null;  
  42.         final SortModel mContent list.get(position);  
  43.         if (view == null)  
  44.             viewHolder new ViewHolder();  
  45.             view LayoutInflater.from(mContext).inflate(R.layout.item, null);  
  46.             viewHolder.tvTitle (TextView) view.findViewById(R.id.title);  
  47.             viewHolder.tvLetter (TextView) view.findViewById(R.id.catalog);  
  48.             view.setTag(viewHolder);  
  49.         else  
  50.             viewHolder (ViewHolder) view.getTag();  
  51.          
  52.           
  53.         //根据position获取分类的首字母的char ascii值  
  54.         int section getSectionForPosition(position);  
  55.           
  56.         //如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现  
  57.         if(position == getPositionForSection(section)){  
  58.             viewHolder.tvLetter.setVisibility(View.VISIBLE);  
  59.             viewHolder.tvLetter.setText(mContent.getSortLetters());  
  60.         }else{  
  61.             viewHolder.tvLetter.setVisibility(View.GONE);  
  62.          
  63.       
  64.         viewHolder.tvTitle.setText(this.list.get(position).getName());  
  65.           
  66.         return view;  
  67.   
  68.      
  69.       
  70.   
  71.   
  72.     final static class ViewHolder  
  73.         TextView tvLetter;  
  74.         TextView tvTitle;  
  75.      
  76.   
  77.   
  78.       
  79.     public int getSectionForPosition(int position)  
  80.         return list.get(position).getSortLetters().charAt(0);  
  81.      
  82.   
  83.       
  84.     public int getPositionForSection(int section)  
  85.         for (int 0; getCount(); i++)  
  86.             String sortStr list.get(i).getSortLetters();  
  87.             char firstChar sortStr.toUpperCase().charAt(0);  
  88.             if (firstChar == section)  
  89.                 return i;  
  90.              
  91.          
  92.           
  93.         return -1;  
  94.      
  95.       
  96.   
  97.     @Override  
  98.     public Object[] getSections()  
  99.         return null;  
  100.      
  101.  
package com.example.sortlistview;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;

public class SortAdapter extends BaseAdapter implements SectionIndexer{
        private List list = null;
        private Context mContext;
        
        public SortAdapter(Context mContext, List list) {
                this.mContext = mContext;
                this.list = list;
        }
        
        
        public void updateListView(List list){
                this.list = list;
                notifyDataSetChanged();
        }

        public int getCount() {
                return this.list.size();
        }

        public Object getItem(int position) {
                return list.get(position);
        }

        public long getItemId(int position) {
                return position;
        }

        public View getView(final int position, View view, ViewGroup arg2) {
                ViewHolder viewHolder = null;
                final SortModel mContent = list.get(position);
                if (view == null) {
                        viewHolder = new ViewHolder();
                        view = LayoutInflater.from(mContext).inflate(R.layout.item, null);
                        viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
                        viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
                        view.setTag(viewHolder);
                } else {
                        viewHolder = (ViewHolder) view.getTag();
                }
                
                //根据position获取分类的首字母的char ascii值
                int section = getSectionForPosition(position);
                
                //如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
                if(position == getPositionForSection(section)){
                        viewHolder.tvLetter.setVisibility(View.VISIBLE);
                        viewHolder.tvLetter.setText(mContent.getSortLetters());
                }else{
                        viewHolder.tvLetter.setVisibility(View.GONE);
                }
        
                viewHolder.tvTitle.setText(this.list.get(position).getName());
                
                return view;

        }
        


        final static class ViewHolder {
                TextView tvLetter;
                TextView tvTitle;
        }


        
        public int getSectionForPosition(int position) {
                return list.get(position).getSortLetters().charAt(0);
        }

        
        public int getPositionForSection(int section) {
                for (int i = 0; i < getCount(); i++) {
                        String sortStr = list.get(i).getSortLetters();
                        char firstChar = sortStr.toUpperCase().charAt(0);
                        if (firstChar == section) {
                                return i;
                        }
                }
                
                return -1;
        }
        

        @Override
        public Object[] getSections() {
                return null;
        }
}

6.MainActivity 这里面的代码比较简单,我们对ClearEditText设置addTextChangedListener监听,当输入框内容发生变化根据里面的值过滤ListView,里面的值为空显示原来的列表,里面对列表数据进行排序用到PinyinComparator接口,该接口主要是用来比较对象的

 

  1. package com.example.sortlistview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.List;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.text.Editable;  
  10. import android.text.TextUtils;  
  11. import android.text.TextWatcher;  
  12. import android.view.View;  
  13. import android.widget.AdapterView;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15. import android.widget.ListView;  
  16. import android.widget.TextView;  
  17. import android.widget.Toast;  
  18.   
  19. import com.example.sortlistview.SideBar.OnTouchingLetterChangedListener;  
  20.   
  21. public class MainActivity extends Activity  
  22.     private ListView sortListView;  
  23.     private SideBar sideBar;  
  24.       
  25.     private TextView dialog;  
  26.     private SortAdapter adapter;  
  27.     private ClearEditText mClearEditText;  
  28.       
  29.       
  30.     private CharacterParser characterParser;  
  31.     private List SourceDateList;  
  32.       
  33.       
  34.     private PinyinComparator pinyinComparator;  
  35.   
  36.     @Override  
  37.     protected void onCreate(Bundle savedInstanceState)  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.activity_main);  
  40.         initViews();  
  41.      
  42.   
  43.     private void initViews()  
  44.         //实例化汉字转拼音类  
  45.         characterParser CharacterParser.getInstance();  
  46.           
  47.         pinyinComparator new PinyinComparator();  
  48.           
  49.         sideBar (SideBar) findViewById(R.id.sidrbar);  
  50.         dialog (TextView) findViewById(R.id.dialog);  
  51.         sideBar.setTextView(dialog);  
  52.           
  53.         //设置右侧触摸监听  
  54.         sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener()  
  55.               
  56.             @Override  
  57.             public void onTouchingLetterChanged(String s)  
  58.                 //该字母首次出现的位置  
  59.                 int position adapter.getPositionForSection(s.charAt(0));  
  60.                 if(position != -1){  
  61.                     sortListView.setSelection(position);  
  62.                  
  63.                   
  64.              
  65.         });  
  66.           
  67.         sortListView (ListView) findViewById(R.id.country_lvcountry);  
  68.         sortListView.setOnItemClickListener(new OnItemClickListener()  
  69.   
  70.             @Override  
  71.             public void onItemClick(AdapterView
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值