Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

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

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

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

?

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

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

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

?

[java]?view plaincopy ?
    class="dp-j">
  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. }??


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

?

?

[java]?view plaincopy ?
  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[]?b?=?{?"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. ?????*?为SideBar设置显示字母的TextView?
  28. ?????*?@param?mTextDialog?
  29. ?????*/??
  30. ????public?void?setTextView(TextView?mTextDialog)?{??
  31. ????????this.mTextDialog?=?mTextDialog;??
  32. ????}??
  33. ??
  34. ??
  35. ????public?SideBar(Context?context,?AttributeSet?attrs,?int?defStyle)?{??
  36. ????????super(context,?attrs,?defStyle);??
  37. ????}??
  38. ??
  39. ????public?SideBar(Context?context,?AttributeSet?attrs)?{??
  40. ????????super(context,?attrs);??
  41. ????}??
  42. ??
  43. ????public?SideBar(Context?context)?{??
  44. ????????super(context);??
  45. ????}??
  46. ??
  47. ????/**?
  48. ?????*?重写这个方法?
  49. ?????*/??
  50. ????protected?void?onDraw(Canvas?canvas)?{??
  51. ????????super.onDraw(canvas);??
  52. ????????//?获取焦点改变背景颜色.??
  53. ????????int?height?=?getHeight();//?获取对应高度??
  54. ????????int?width?=?getWidth();?//?获取对应宽度??
  55. ????????int?singleHeight?=?height?/?b.length;//?获取每一个字母的高度??
  56. ??
  57. ????????for?(int?i?=?0;?i?<?b.length;?i++)?{??
  58. ????????????paint.setColor(Color.rgb(33,?65,?98));??
  59. ????????????//?paint.setColor(Color.WHITE);??
  60. ????????????paint.setTypeface(Typeface.DEFAULT_BOLD);??
  61. ????????????paint.setAntiAlias(true);??
  62. ????????????paint.setTextSize(20);??
  63. ????????????//?选中的状态??
  64. ????????????if?(i?==?choose)?{??
  65. ????????????????paint.setColor(Color.parseColor("#3399ff"));??
  66. ????????????????paint.setFakeBoldText(true);??
  67. ????????????}??
  68. ????????????//?x坐标等于中间-字符串宽度的一半.??
  69. ????????????float?xPos?=?width?/?2?-?paint.measureText(b[i])?/?2;??
  70. ????????????float?yPos?=?singleHeight?*?i?+?singleHeight;??
  71. ????????????canvas.drawText(b[i],?xPos,?yPos,?paint);??
  72. ????????????paint.reset();//?重置画笔??
  73. ????????}??
  74. ??
  75. ????}??
  76. ??
  77. ????@Override??
  78. ????public?boolean?dispatchTouchEvent(MotionEvent?event)?{??
  79. ????????final?int?action?=?event.getAction();??
  80. ????????final?float?y?=?event.getY();//?点击y坐标??
  81. ????????final?int?oldChoose?=?choose;??
  82. ????????final?OnTouchingLetterChangedListener?listener?=?onTouchingLetterChangedListener;??
  83. ????????final?int?c?=?(int)?(y?/?getHeight()?*?b.length);//?点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.??
  84. ??
  85. ????????switch?(action)?{??
  86. ????????case?MotionEvent.ACTION_UP:??
  87. ????????????setBackgroundDrawable(new?ColorDrawable(0x00000000));??
  88. ????????????choose?=?-1;//??
  89. ????????????invalidate();??
  90. ????????????if?(mTextDialog?!=?null)?{??
  91. ????????????????mTextDialog.setVisibility(View.INVISIBLE);??
  92. ????????????}??
  93. ????????????break;??
  94. ??
  95. ????????default:??
  96. ????????????setBackgroundResource(R.drawable.sidebar_background);??
  97. ????????????if?(oldChoose?!=?c)?{??
  98. ????????????????if?(c?>=?0?&&?c?<?b.length)?{??
  99. ????????????????????if?(listener?!=?null)?{??
  100. ????????????????????????listener.onTouchingLetterChanged(b[c]);??
  101. ????????????????????}??
  102. ????????????????????if?(mTextDialog?!=?null)?{??
  103. ????????????????????????mTextDialog.setText(b[c]);??
  104. ????????????????????????mTextDialog.setVisibility(View.VISIBLE);??
  105. ????????????????????}??
  106. ??????????????????????
  107. ????????????????????choose?=?c;??
  108. ????????????????????invalidate();??
  109. ????????????????}??
  110. ????????????}??
  111. ??
  112. ????????????break;??
  113. ????????}??
  114. ????????return?true;??
  115. ????}??
  116. ??
  117. ????/**?
  118. ?????*?向外公开的方法?
  119. ?????*??
  120. ?????*?@param?onTouchingLetterChangedListener?
  121. ?????*/??
  122. ????public?void?setOnTouchingLetterChangedListener(??
  123. ????????????OnTouchingLetterChangedListener?onTouchingLetterChangedListener)?{??
  124. ????????this.onTouchingLetterChangedListener?=?onTouchingLetterChangedListener;??
  125. ????}??
  126. ??
  127. ????/**?
  128. ?????*?接口?
  129. ?????*??
  130. ?????*?@author?coder?
  131. ?????*??
  132. ?????*/??
  133. ????public?interface?OnTouchingLetterChangedListener?{??
  134. ????????public?void?onTouchingLetterChanged(String?s);??
  135. ????}??
  136. ??
  137. }??

?

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

?

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

?

?

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

?

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

?

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

?

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

?

[java]?view plaincopy ?
  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<SortModel>?list?=?null;??
  15. ????private?Context?mContext;??
  16. ??????
  17. ????public?SortAdapter(Context?mContext,?List<SortModel>?list)?{??
  18. ????????this.mContext?=?mContext;??
  19. ????????this.list?=?list;??
  20. ????}??
  21. ??????
  22. ????/**?
  23. ?????*?当ListView数据发生变化时,调用此方法来更新ListView?
  24. ?????*?@param?list?
  25. ?????*/??
  26. ????public?void?updateListView(List<SortModel>?list){??
  27. ????????this.list?=?list;??
  28. ????????notifyDataSetChanged();??
  29. ????}??
  30. ??
  31. ????public?int?getCount()?{??
  32. ????????return?this.list.size();??
  33. ????}??
  34. ??
  35. ????public?Object?getItem(int?position)?{??
  36. ????????return?list.get(position);??
  37. ????}??
  38. ??
  39. ????public?long?getItemId(int?position)?{??
  40. ????????return?position;??
  41. ????}??
  42. ??
  43. ????public?View?getView(final?int?position,?View?view,?ViewGroup?arg2)?{??
  44. ????????ViewHolder?viewHolder?=?null;??
  45. ????????final?SortModel?mContent?=?list.get(position);??
  46. ????????if?(view?==?null)?{??
  47. ????????????viewHolder?=?new?ViewHolder();??
  48. ????????????view?=?LayoutInflater.from(mContext).inflate(R.layout.item,?null);??
  49. ????????????viewHolder.tvTitle?=?(TextView)?view.findViewById(R.id.title);??
  50. ????????????viewHolder.tvLetter?=?(TextView)?view.findViewById(R.id.catalog);??
  51. ????????????view.setTag(viewHolder);??
  52. ????????}?else?{??
  53. ????????????viewHolder?=?(ViewHolder)?view.getTag();??
  54. ????????}??
  55. ??????????
  56. ????????//根据position获取分类的首字母的char?ascii值??
  57. ????????int?section?=?getSectionForPosition(position);??
  58. ??????????
  59. ????????//如果当前位置等于该分类首字母的Char的位置?,则认为是第一次出现??
  60. ????????if(position?==?getPositionForSection(section)){??
  61. ????????????viewHolder.tvLetter.setVisibility(View.VISIBLE);??
  62. ????????????viewHolder.tvLetter.setText(mContent.getSortLetters());??
  63. ????????}else{??
  64. ????????????viewHolder.tvLetter.setVisibility(View.GONE);??
  65. ????????}??
  66. ??????
  67. ????????viewHolder.tvTitle.setText(this.list.get(position).getName());??
  68. ??????????
  69. ????????return?view;??
  70. ??
  71. ????}??
  72. ??????
  73. ??
  74. ??
  75. ????final?static?class?ViewHolder?{??
  76. ????????TextView?tvLetter;??
  77. ????????TextView?tvTitle;??
  78. ????}??
  79. ??
  80. ??
  81. ????/**?
  82. ?????*?根据ListView的当前位置获取分类的首字母的char?ascii值?
  83. ?????*/??
  84. ????public?int?getSectionForPosition(int?position)?{??
  85. ????????return?list.get(position).getSortLetters().charAt(0);??
  86. ????}??
  87. ??
  88. ????/**?
  89. ?????*?根据分类的首字母的Char?ascii值获取其第一次出现该首字母的位置?
  90. ?????*/??
  91. ????public?int?getPositionForSection(int?section)?{??
  92. ????????for?(int?i?=?0;?i?<?getCount();?i++)?{??
  93. ????????????String?sortStr?=?list.get(i).getSortLetters();??
  94. ????????????char?firstChar?=?sortStr.toUpperCase().charAt(0);??
  95. ????????????if?(firstChar?==?section)?{??
  96. ????????????????return?i;??
  97. ????????????}??
  98. ????????}??
  99. ??????????
  100. ????????return?-1;??
  101. ????}??
  102. ??????
  103. ??
  104. ????@Override??
  105. ????public?Object[]?getSections()?{??
  106. ????????return?null;??
  107. ????}??
  108. }??


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

?

?

[java]?view plaincopy ?
  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. ?????*?显示字母的TextView?
  26. ?????*/??
  27. ????private?TextView?dialog;??
  28. ????private?SortAdapter?adapter;??
  29. ????private?ClearEditText?mClearEditText;??
  30. ??????
  31. ????/**?
  32. ?????*?汉字转换成拼音的类?
  33. ?????*/??
  34. ????private?CharacterParser?characterParser;??
  35. ????private?List<SortModel>?SourceDateList;??
  36. ??????
  37. ????/**?
  38. ?????*?根据拼音来排列ListView里面的数据类?
  39. ?????*/??
  40. ????private?PinyinComparator?pinyinComparator;??
  41. ??
  42. ????@Override??
  43. ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  44. ????????super.onCreate(savedInstanceState);??
  45. ????????setContentView(R.layout.activity_main);??
  46. ????????initViews();??
  47. ????}??
  48. ??
  49. ????private?void?initViews()?{??
  50. ????????//实例化汉字转拼音类??
  51. ????????characterParser?=?CharacterParser.getInstance();??
  52. ??????????
  53. ????????pinyinComparator?=?new?PinyinComparator();??
  54. ??????????
  55. ????????sideBar?=?(SideBar)?findViewById(R.id.sidrbar);??
  56. ????????dialog?=?(TextView)?findViewById(R.id.dialog);??
  57. ????????sideBar.setTextView(dialog);??
  58. ??????????
  59. ????????//设置右侧触摸监听??
  60. ????????sideBar.setOnTouchingLetterChangedListener(new?OnTouchingLetterChangedListener()?{??
  61. ??????????????
  62. ????????????@Override??
  63. ????????????public?void?onTouchingLetterChanged(String?s)?{??
  64. ????????????????//该字母首次出现的位置??
  65. ????????????????int?position?=?adapter.getPositionForSection(s.charAt(0));??
  66. ????????????????if(position?!=?-1){??
  67. ????????????????????sortListView.setSelection(position);??
  68. ????????????????}??
  69. ??????????????????
  70. ????????????}??
  71. ????????});??
  72. ??????????
  73. ????????sortListView?=?(ListView)?findViewById(R.id.country_lvcountry);??
  74. ????????sortListView.setOnItemClickListener(new?OnItemClickListener()?{??
  75. ??
  76. ????????????@Override??
  77. ????????????public?void?onItemClick(AdapterView<?>?parent,?View?view,??
  78. ????????????????????int?position,?long?id)?{??
  79. ????????????????//这里要利用adapter.getItem(position)来获取当前position所对应的对象??
  80. ????????????????Toast.makeText(getApplication(),?((SortModel)adapter.getItem(position)).getName(),?Toast.LENGTH_SHORT).show();??
  81. ????????????}??
  82. ????????});??
  83. ??????????
  84. ????????SourceDateList?=?filledData(getResources().getStringArray(R.array.date));??
  85. ??????????
  86. ????????//?根据a-z进行排序源数据??
  87. ????????Collections.sort(SourceDateList,?pinyinComparator);??
  88. ????????adapter?=?new?SortAdapter(this,?SourceDateList);??
  89. ????????sortListView.setAdapter(adapter);??
  90. ??????????
  91. ??????????
  92. ????????mClearEditText?=?(ClearEditText)?findViewById(R.id.filter_edit);??
  93. ??????????
  94. ????????//根据输入框输入值的改变来过滤搜索??
  95. ????????mClearEditText.addTextChangedListener(new?TextWatcher()?{??
  96. ??????????????
  97. ????????????@Override??
  98. ????????????public?void?onTextChanged(CharSequence?s,?int?start,?int?before,?int?count)?{??
  99. ????????????????//当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表??
  100. ????????????????filterData(s.toString());??
  101. ????????????}??
  102. ??????????????
  103. ????????????@Override??
  104. ????????????public?void?beforeTextChanged(CharSequence?s,?int?start,?int?count,??
  105. ????????????????????int?after)?{??
  106. ??????????????????
  107. ????????????}??
  108. ??????????????
  109. ????????????@Override??
  110. ????????????public?void?afterTextChanged(Editable?s)?{??
  111. ????????????}??
  112. ????????});??
  113. ????}??
  114. ??
  115. ??
  116. ????/**?
  117. ?????*?为ListView填充数据?
  118. ?????*?@param?date?
  119. ?????*?@return?
  120. ?????*/??
  121. ????private?List<SortModel>?filledData(String?[]?date){??
  122. ????????List<SortModel>?mSortList?=?new?ArrayList<SortModel>();??
  123. ??????????
  124. ????????for(int?i=0;?i<date.length;?i++){??
  125. ????????????SortModel?sortModel?=?new?SortModel();??
  126. ????????????sortModel.setName(date[i]);??
  127. ????????????//汉字转换成拼音??
  128. ????????????String?pinyin?=?characterParser.getSelling(date[i]);??
  129. ????????????String?sortString?=?pinyin.substring(0,?1).toUpperCase();??
  130. ??????????????
  131. ????????????//?正则表达式,判断首字母是否是英文字母??
  132. ????????????if(sortString.matches("[A-Z]")){??
  133. ????????????????sortModel.setSortLetters(sortString.toUpperCase());??
  134. ????????????}else{??
  135. ????????????????sortModel.setSortLetters("#");??
  136. ????????????}??
  137. ??????????????
  138. ????????????mSortList.add(sortModel);??
  139. ????????}??
  140. ????????return?mSortList;??
  141. ??????????
  142. ????}??
  143. ??????
  144. ????/**?
  145. ?????*?根据输入框中的值来过滤数据并更新ListView?
  146. ?????*?@param?filterStr?
  147. ?????*/??
  148. ????private?void?filterData(String?filterStr)?{??
  149. ????????List<SortModel>?filterDateList?=?new?ArrayList<SortModel>();??
  150. ??
  151. ????????if?(TextUtils.isEmpty(filterStr))?{??
  152. ????????????filterDateList?=?SourceDateList;??
  153. ????????}?else?{??
  154. ????????????filterDateList.clear();??
  155. ????????????for?(SortModel?sortModel?:?SourceDateList)?{??
  156. ????????????????String?name?=?sortModel.getName();??
  157. ????????????????if?(name.toUpperCase().indexOf(??
  158. ????????????????????????filterStr.toString().toUpperCase())?!=?-1??
  159. ????????????????????????||?characterParser.getSelling(name).toUpperCase()??
  160. ????????????????????????????????.startsWith(filterStr.toString().toUpperCase()))?{??
  161. ????????????????????filterDateList.add(sortModel);??
  162. ????????????????}??
  163. ????????????}??
  164. ????????}??
  165. ??????????
  166. ????????//?根据a-z进行排序??
  167. ????????Collections.sort(filterDateList,?pinyinComparator);??
  168. ????????adapter.updateListView(filterDateList);??
  169. ????}??
  170. ??????
  171. }??

?

7.PinyinComparator接口用来对ListView中的数据根据A-Z进行排序,前面两个if判断主要是将不是以汉字开头的数据放在后面

?

[java]?view plaincopy ?
  1. package?com.example.sortlistview;??
  2. ??
  3. import?java.util.Comparator;??
  4. ??
  5. /**?
  6. ?*??
  7. ?*?@author?xiaanming?
  8. ?*?
  9. ?*/??
  10. public?class?PinyinComparator?implements?Comparator<SortModel>?{??
  11. ??
  12. ????public?int?compare(SortModel?o1,?SortModel?o2)?{??
  13. ????????//这里主要是用来对ListView里面的数据根据ABCDEFG...来排序??
  14. ????????if?(o2.getSortLetters().equals("#"))?{??
  15. ????????????return?-1;??
  16. ????????}?else?if?(o1.getSortLetters().equals("#"))?{??
  17. ????????????return?1;??
  18. ????????}?else?{??
  19. ????????????return?o1.getSortLetters().compareTo(o2.getSortLetters());??
  20. ????????}??
  21. ????}??
  22. } ?

?

?源码下载地址 :http://www.32666.com/file-582076.html

发表评论
用户名: 匿名