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


ListView的A-Z字母排序 ListView的过滤搜索 汉字转成拼音

转载请注明出处: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拼音的首字母

[java] view plain copy
  1. packagecom.example.sortlistview;
  2. publicclassSortModel{
  3. privateStringname;//显示的数据
  4. privateStringsortLetters;//显示数据拼音的首字母
  5. publicStringgetName(){
  6. returnname;
  7. }
  8. publicvoidsetName(Stringname){
  9. this.name=name;
  10. }
  11. publicStringgetSortLetters(){
  12. returnsortLetters;
  13. }
  14. publicvoidsetSortLetters(StringsortLetters){
  15. this.sortLetters=sortLetters;
  16. }
  17. }

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

[java] view plain copy
  1. packagecom.example.sortlistview;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Typeface;
  7. importandroid.graphics.drawable.ColorDrawable;
  8. importandroid.util.AttributeSet;
  9. importandroid.view.MotionEvent;
  10. importandroid.view.View;
  11. importandroid.widget.TextView;
  12. publicclassSideBarextendsView{
  13. //触摸事件
  14. privateOnTouchingLetterChangedListeneronTouchingLetterChangedListener;
  15. //26个字母
  16. publicstaticString[]b={"A","B","C","D","E","F","G","H","I",
  17. "J","K","L","M","N","O","P","Q","R","S","T","U","V",
  18. "W","X","Y","Z","#"};
  19. privateintchoose=-1;//选中
  20. privatePaintpaint=newPaint();
  21. privateTextViewmTextDialog;
  22. /**
  23. *为SideBar设置显示字母的TextView
  24. *@parammTextDialog
  25. */
  26. publicvoidsetTextView(TextViewmTextDialog){
  27. this.mTextDialog=mTextDialog;
  28. }
  29. publicSideBar(Contextcontext,AttributeSetattrs,intdefStyle){
  30. super(context,attrs,defStyle);
  31. }
  32. publicSideBar(Contextcontext,AttributeSetattrs){
  33. super(context,attrs);
  34. }
  35. publicSideBar(Contextcontext){
  36. super(context);
  37. }
  38. /**
  39. *重写这个方法
  40. */
  41. protectedvoidonDraw(Canvascanvas){
  42. super.onDraw(canvas);
  43. //获取焦点改变背景颜色.
  44. intheight=getHeight();//获取对应高度
  45. intwidth=getWidth();//获取对应宽度
  46. intsingleHeight=height/b.length;//获取每一个字母的高度
  47. for(inti=0;i<b.length;i++){
  48. paint.setColor(Color.rgb(33,65,98));
  49. //paint.setColor(Color.WHITE);
  50. paint.setTypeface(Typeface.DEFAULT_BOLD);
  51. paint.setAntiAlias(true);
  52. paint.setTextSize(20);
  53. //选中的状态
  54. if(i==choose){
  55. paint.setColor(Color.parseColor("#3399ff"));
  56. paint.setFakeBoldText(true);
  57. }
  58. //x坐标等于中间-字符串宽度的一半.
  59. floatxPos=width/2-paint.measureText(b[i])/2;
  60. floatyPos=singleHeight*i+singleHeight;
  61. canvas.drawText(b[i],xPos,yPos,paint);
  62. paint.reset();//重置画笔
  63. }
  64. }
  65. @Override
  66. publicbooleandispatchTouchEvent(MotionEventevent){
  67. finalintaction=event.getAction();
  68. finalfloaty=event.getY();//点击y坐标
  69. finalintoldChoose=choose;
  70. finalOnTouchingLetterChangedListenerlistener=onTouchingLetterChangedListener;
  71. finalintc=(int)(y/getHeight()*b.length);//点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.
  72. switch(action){
  73. caseMotionEvent.ACTION_UP:
  74. setBackgroundDrawable(newColorDrawable(0x00000000));
  75. choose=-1;//
  76. invalidate();
  77. if(mTextDialog!=null){
  78. mTextDialog.setVisibility(View.INVISIBLE);
  79. }
  80. break;
  81. default:
  82. setBackgroundResource(R.drawable.sidebar_background);
  83. if(oldChoose!=c){
  84. if(c>=0&&c<b.length){
  85. if(listener!=null){
  86. listener.onTouchingLetterChanged(b[c]);
  87. }
  88. if(mTextDialog!=null){
  89. mTextDialog.setText(b[c]);
  90. mTextDialog.setVisibility(View.VISIBLE);
  91. }
  92. choose=c;
  93. invalidate();
  94. }
  95. }
  96. break;
  97. }
  98. returntrue;
  99. }
  100. /**
  101. *向外公开的方法
  102. *
  103. *@paramonTouchingLetterChangedListener
  104. */
  105. publicvoidsetOnTouchingLetterChangedListener(
  106. OnTouchingLetterChangedListeneronTouchingLetterChangedListener){
  107. this.onTouchingLetterChangedListener=onTouchingLetterChangedListener;
  108. }
  109. /**
  110. *接口
  111. *
  112. *@authorcoder
  113. *
  114. */
  115. publicinterfaceOnTouchingLetterChangedListener{
  116. publicvoidonTouchingLetterChanged(Strings);
  117. }
  118. }

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

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


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是66 ,也就是‘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 plain copy
  1. packagecom.example.sortlistview;
  2. importjava.util.List;
  3. importandroid.content.Context;
  4. importandroid.view.LayoutInflater;
  5. importandroid.view.View;
  6. importandroid.view.ViewGroup;
  7. importandroid.widget.BaseAdapter;
  8. importandroid.widget.SectionIndexer;
  9. importandroid.widget.TextView;
  10. publicclassSortAdapterextendsBaseAdapterimplementsSectionIndexer{
  11. privateList<SortModel>list=null;
  12. privateContextmContext;
  13. publicSortAdapter(ContextmContext,List<SortModel>list){
  14. this.mContext=mContext;
  15. this.list=list;
  16. }
  17. /**
  18. *当ListView数据发生变化时,调用此方法来更新ListView
  19. *@paramlist
  20. */
  21. publicvoidupdateListView(List<SortModel>list){
  22. this.list=list;
  23. notifyDataSetChanged();
  24. }
  25. publicintgetCount(){
  26. returnthis.list.size();
  27. }
  28. publicObjectgetItem(intposition){
  29. returnlist.get(position);
  30. }
  31. publiclonggetItemId(intposition){
  32. returnposition;
  33. }
  34. publicViewgetView(finalintposition,Viewview,ViewGrouparg2){
  35. ViewHolderviewHolder=null;
  36. finalSortModelmContent=list.get(position);
  37. if(view==null){
  38. viewHolder=newViewHolder();
  39. view=LayoutInflater.from(mContext).inflate(R.layout.item,null);
  40. viewHolder.tvTitle=(TextView)view.findViewById(R.id.title);
  41. viewHolder.tvLetter=(TextView)view.findViewById(R.id.catalog);
  42. view.setTag(viewHolder);
  43. }else{
  44. viewHolder=(ViewHolder)view.getTag();
  45. }
  46. //根据position获取分类的首字母的charascii值
  47. intsection=getSectionForPosition(position);
  48. //如果当前位置等于该分类首字母的Char的位置,则认为是第一次出现
  49. if(position==getPositionForSection(section)){
  50. viewHolder.tvLetter.setVisibility(View.VISIBLE);
  51. viewHolder.tvLetter.setText(mContent.getSortLetters());
  52. }else{
  53. viewHolder.tvLetter.setVisibility(View.GONE);
  54. }
  55. viewHolder.tvTitle.setText(this.list.get(position).getName());
  56. returnview;
  57. }
  58. finalstaticclassViewHolder{
  59. TextViewtvLetter;
  60. TextViewtvTitle;
  61. }
  62. /**
  63. *根据ListView的当前位置获取分类的首字母的charascii值
  64. */
  65. publicintgetSectionForPosition(intposition){
  66. returnlist.get(position).getSortLetters().charAt(0);
  67. }
  68. /**
  69. *根据分类的首字母的Charascii值获取其第一次出现该首字母的位置
  70. */
  71. publicintgetPositionForSection(intsection){
  72. for(inti=0;i<getCount();i++){
  73. StringsortStr=list.get(i).getSortLetters();
  74. charfirstChar=sortStr.toUpperCase().charAt(0);
  75. if(firstChar==section){
  76. returni;
  77. }
  78. }
  79. return-1;
  80. }
  81. @Override
  82. publicObject[]getSections(){
  83. returnnull;
  84. }
  85. }

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

[java] view plain copy
  1. packagecom.example.sortlistview;
  2. importjava.util.ArrayList;
  3. importjava.util.Collections;
  4. importjava.util.List;
  5. importandroid.app.Activity;
  6. importandroid.os.Bundle;
  7. importandroid.text.Editable;
  8. importandroid.text.TextUtils;
  9. importandroid.text.TextWatcher;
  10. importandroid.view.View;
  11. importandroid.widget.AdapterView;
  12. importandroid.widget.AdapterView.OnItemClickListener;
  13. importandroid.widget.ListView;
  14. importandroid.widget.TextView;
  15. importandroid.widget.Toast;
  16. importcom.example.sortlistview.SideBar.OnTouchingLetterChangedListener;
  17. publicclassMainActivityextendsActivity{
  18. privateListViewsortListView;
  19. privateSideBarsideBar;
  20. /**
  21. *显示字母的TextView
  22. */
  23. privateTextViewdialog;
  24. privateSortAdapteradapter;
  25. privateClearEditTextmClearEditText;
  26. /**
  27. *汉字转换成拼音的类
  28. */
  29. privateCharacterParsercharacterParser;
  30. privateList<SortModel>SourceDateList;
  31. /**
  32. *根据拼音来排列ListView里面的数据类
  33. */
  34. privatePinyinComparatorpinyinComparator;
  35. @Override
  36. protectedvoidonCreate(BundlesavedInstanceState){
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.activity_main);
  39. initViews();
  40. }
  41. privatevoidinitViews(){
  42. //实例化汉字转拼音类
  43. characterParser=CharacterParser.getInstance();
  44. pinyinComparator=newPinyinComparator();
  45. sideBar=(SideBar)findViewById(R.id.sidrbar);
  46. dialog=(TextView)findViewById(R.id.dialog);
  47. sideBar.setTextView(dialog);
  48. //设置右侧触摸监听
  49. sideBar.setOnTouchingLetterChangedListener(newOnTouchingLetterChangedListener(){
  50. @Override
  51. publicvoidonTouchingLetterChanged(Strings){
  52. //该字母首次出现的位置
  53. intposition=adapter.getPositionForSection(s.charAt(0));
  54. if(position!=-1){
  55. sortListView.setSelection(position);
  56. }
  57. }
  58. });
  59. sortListView=(ListView)findViewById(R.id.country_lvcountry);
  60. sortListView.setOnItemClickListener(newOnItemClickListener(){
  61. @Override
  62. publicvoidonItemClick(AdapterView<?>parent,Viewview,
  63. intposition,longid){
  64. //这里要利用adapter.getItem(position)来获取当前position所对应的对象
  65. Toast.makeText(getApplication(),((SortModel)adapter.getItem(position)).getName(),Toast.LENGTH_SHORT).show();
  66. }
  67. });
  68. SourceDateList=filledData(getResources().getStringArray(R.array.date));
  69. //根据a-z进行排序源数据
  70. Collections.sort(SourceDateList,pinyinComparator);
  71. adapter=newSortAdapter(this,SourceDateList);
  72. sortListView.setAdapter(adapter);
  73. mClearEditText=(ClearEditText)findViewById(R.id.filter_edit);
  74. //根据输入框输入值的改变来过滤搜索
  75. mClearEditText.addTextChangedListener(newTextWatcher(){
  76. @Override
  77. publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
  78. //当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
  79. filterData(s.toString());
  80. }
  81. @Override
  82. publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
  83. intafter){
  84. }
  85. @Override
  86. publicvoidafterTextChanged(Editables){
  87. }
  88. });
  89. }
  90. /**
  91. *为ListView填充数据
  92. *@paramdate
  93. *@return
  94. */
  95. privateList<SortModel>filledData(String[]date){
  96. List<SortModel>mSortList=newArrayList<SortModel>();
  97. for(inti=0;i<date.length;i++){
  98. SortModelsortModel=newSortModel();
  99. sortModel.setName(date[i]);
  100. //汉字转换成拼音
  101. Stringpinyin=characterParser.getSelling(date[i]);
  102. StringsortString=pinyin.substring(0,1).toUpperCase();
  103. //正则表达式,判断首字母是否是英文字母
  104. if(sortString.matches("[A-Z]")){
  105. sortModel.setSortLetters(sortString.toUpperCase());
  106. }else{
  107. sortModel.setSortLetters("#");
  108. }
  109. mSortList.add(sortModel);
  110. }
  111. returnmSortList;
  112. }
  113. /**
  114. *根据输入框中的值来过滤数据并更新ListView
  115. *@paramfilterStr
  116. */
  117. privatevoidfilterData(StringfilterStr){
  118. List<SortModel>filterDateList=newArrayList<SortModel>();
  119. if(TextUtils.isEmpty(filterStr)){
  120. filterDateList=SourceDateList;
  121. }else{
  122. filterDateList.clear();
  123. for(SortModelsortModel:SourceDateList){
  124. Stringname=sortModel.getName();
  125. if(name.toUpperCase().indexOf(
  126. filterStr.toString().toUpperCase())!=-1
  127. ||characterParser.getSelling(name).toUpperCase()
  128. .startsWith(filterStr.toString().toUpperCase())){
  129. filterDateList.add(sortModel);
  130. }
  131. }
  132. }
  133. //根据a-z进行排序
  134. Collections.sort(filterDateList,pinyinComparator);
  135. adapter.updateListView(filterDateList);
  136. }
  137. }

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

[java] view plain copy
  1. packagecom.example.sortlistview;
  2. importjava.util.Comparator;
  3. /**
  4. *
  5. *@authorxiaanming
  6. *
  7. */
  8. publicclassPinyinComparatorimplementsComparator<SortModel>{
  9. publicintcompare(SortModelo1,SortModelo2){
  10. //这里主要是用来对ListView里面的数据根据ABCDEFG...来排序
  11. if(o2.getSortLetters().equals("#")){
  12. return-1;
  13. }elseif(o1.getSortLetters().equals("#")){
  14. return1;
  15. }else{
  16. returno1.getSortLetters().compareTo(o2.getSortLetters());
  17. }
  18. }
  19. }



更多相关文章

  1. 【android】第一行代码CoolWeather中遇到的问题
  2. 【Android】按钮设置字母不全部大写,button set text to lower ca
  3. Android之利用正则表达式校验邮箱、手机号、密码、身份证号码等
  4. 新浪分享 Insufficient app permissions!
  5. 格式化字符串长度,超出部分显示省略号,区分汉字跟字母
  6. native的Socket向Android的LocalSocketServer发送汉字乱码的问题
  7. Android使用Unicode码对中文进行字母索引的2种方法
  8. Android读取本地json文件的方法(解决显示乱码问题)
  9. Android自定义键盘之汉字键盘

随机推荐

  1. Android中蓝牙的简单使用
  2. Android实现打地鼠小游戏
  3. C语言实现android中内存和CPUUsage的控制
  4. android 对话框中弹出对话框原对话框关闭
  5. android 打开Eclipse之后android项目都报
  6. @Override annotation error(Eclipse导入
  7. android 加载有图的HTML
  8. Android(安卓)小视频开发 腾讯云sdk的坑
  9. Android Studio3.0以后outputfile不可用
  10. Android学习(十) SQLite 基于SQL语句的操作