`
king_tt
  • 浏览: 2116499 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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. 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)中来处理不同的操作

  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)方法,将词组转换成拼音

  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是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,则显示分类字母 否则隐藏

  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接口,该接口主要是用来比较对象的

  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判断主要是将不是以汉字开头的数据放在后面

  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. }


这样我们以后使用A-Z排序就没要局限性了,想加这个效果随时都行,其他的布局和图片之类的文件就不贴出来了,如果大家有兴趣的自行去下载代码吧,如果大家有什么疑问,请在下面留言,我会为大家解答的!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics