前段时间因为换工作的缘故又恰巧碰到国庆节,所以有段时间自己没有更新博客了,过完国庆到新公司报道,感觉还不错,就是现在住的地方离新公司有点远,地铁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">
- 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(TextView mTextDialog)来设置用来显示当前按下的字母的TextView,以及使用setOnTouchingLetterChangedListener方法来设置回调接口,在回调方法onTouchingLetterChanged(String s)中来处理不同的操作
?
?
[java]?view plaincopy
?
- 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?OnTouchingLetterChangedListener?onTouchingLetterChangedListener;??
- ??????
- ????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.setTypeface(Typeface.DEFAULT_BOLD);??
- ????????????paint.setAntiAlias(true);??
- ????????????paint.setTextSize(20);??
- ??????????????
- ????????????if?(i?==?choose)?{??
- ????????????????paint.setColor(Color.parseColor("#3399ff"));??
- ????????????????paint.setFakeBoldText(true);??
- ????????????}??
- ??????????????
- ????????????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();??
- ????????final?int?oldChoose?=?choose;??
- ????????final?OnTouchingLetterChangedListener?listener?=?onTouchingLetterChangedListener;??
- ????????final?int?c?=?(int)?(y?/?getHeight()?*?b.length);??
- ??
- ????????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?setOnTouchingLetterChangedListener(??
- ????????????OnTouchingLetterChangedListener?onTouchingLetterChangedListener)?{??
- ????????this.onTouchingLetterChangedListener?=?onTouchingLetterChangedListener;??
- ????}??
- ??
- ?????
- ?
- ?
- ?
- ?
- ??
- ????public?interface?OnTouchingLetterChangedListener?{??
- ????????public?void?onTouchingLetterChanged(String?s);??
- ????}??
- ??
- }??
?
3.CharacterParser?这个类是将汉字转换成拼音的类,该拼音没有声调的,该类是单例类,其中定义了三个方法,在这个demo中用到的是getSelling(String chs)方法,将词组转换成拼音
?
[java]?view plaincopy
?
- 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(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
?
- 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<SortModel>?list?=?null;??
- ????private?Context?mContext;??
- ??????
- ????public?SortAdapter(Context?mContext,?List<SortModel>?list)?{??
- ????????this.mContext?=?mContext;??
- ????????this.list?=?list;??
- ????}??
- ??????
- ?????
- ?
- ?
- ??
- ????public?void?updateListView(List<SortModel>?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();??
- ????????}??
- ??????????
- ??????????
- ????????int?section?=?getSectionForPosition(position);??
- ??????????
- ??????????
- ????????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接口,该接口主要是用来比较对象的
?
?
[java]?view plaincopy
?
- package?com.example.sortlistview;??
- ??
- import?java.util.ArrayList;??
- import?java.util.Collections;??
- import?java.util.List;??
- ??
- import?android.app.Activity;??
- import?android.os.Bundle;??
- import?android.text.Editable;??
- import?android.text.TextUtils;??
- import?android.text.TextWatcher;??
- import?android.view.View;??
- import?android.widget.AdapterView;??
- import?android.widget.AdapterView.OnItemClickListener;??
- import?android.widget.ListView;??
- import?android.widget.TextView;??
- import?android.widget.Toast;??
- ??
- import?com.example.sortlistview.SideBar.OnTouchingLetterChangedListener;??
- ??
- public?class?MainActivity?extends?Activity?{??
- ????private?ListView?sortListView;??
- ????private?SideBar?sideBar;??
- ?????
- ?
- ??
- ????private?TextView?dialog;??
- ????private?SortAdapter?adapter;??
- ????private?ClearEditText?mClearEditText;??
- ??????
- ?????
- ?
- ??
- ????private?CharacterParser?characterParser;??
- ????private?List<SortModel>?SourceDateList;??
- ??????
- ?????
- ?
- ??
- ????private?PinyinComparator?pinyinComparator;??
- ??
- ????@Override??
- ????protected?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.activity_main);??
- ????????initViews();??
- ????}??
- ??
- ????private?void?initViews()?{??
- ??????????
- ????????characterParser?=?CharacterParser.getInstance();??
- ??????????
- ????????pinyinComparator?=?new?PinyinComparator();??
- ??????????
- ????????sideBar?=?(SideBar)?findViewById(R.id.sidrbar);??
- ????????dialog?=?(TextView)?findViewById(R.id.dialog);??
- ????????sideBar.setTextView(dialog);??
- ??????????
- ??????????
- ????????sideBar.setOnTouchingLetterChangedListener(new?OnTouchingLetterChangedListener()?{??
- ??????????????
- ????????????@Override??
- ????????????public?void?onTouchingLetterChanged(String?s)?{??
- ??????????????????
- ????????????????int?position?=?adapter.getPositionForSection(s.charAt(0));??
- ????????????????if(position?!=?-1){??
- ????????????????????sortListView.setSelection(position);??
- ????????????????}??
- ??????????????????
- ????????????}??
- ????????});??
- ??????????
- ????????sortListView?=?(ListView)?findViewById(R.id.country_lvcountry);??
- ????????sortListView.setOnItemClickListener(new?OnItemClickListener()?{??
- ??
- ????????????@Override??
- ????????????public?void?onItemClick(AdapterView<?>?parent,?View?view,??
- ????????????????????int?position,?long?id)?{??
- ??????????????????
- ????????????????Toast.makeText(getApplication(),?((SortModel)adapter.getItem(position)).getName(),?Toast.LENGTH_SHORT).show();??
- ????????????}??
- ????????});??
- ??????????
- ????????SourceDateList?=?filledData(getResources().getStringArray(R.array.date));??
- ??????????
- ??????????
- ????????Collections.sort(SourceDateList,?pinyinComparator);??
- ????????adapter?=?new?SortAdapter(this,?SourceDateList);??
- ????????sortListView.setAdapter(adapter);??
- ??????????
- ??????????
- ????????mClearEditText?=?(ClearEditText)?findViewById(R.id.filter_edit);??
- ??????????
- ??????????
- ????????mClearEditText.addTextChangedListener(new?TextWatcher()?{??
- ??????????????
- ????????????@Override??
- ????????????public?void?onTextChanged(CharSequence?s,?int?start,?int?before,?int?count)?{??
- ??????????????????
- ????????????????filterData(s.toString());??
- ????????????}??
- ??????????????
- ????????????@Override??
- ????????????public?void?beforeTextChanged(CharSequence?s,?int?start,?int?count,??
- ????????????????????int?after)?{??
- ??????????????????
- ????????????}??
- ??????????????
- ????????????@Override??
- ????????????public?void?afterTextChanged(Editable?s)?{??
- ????????????}??
- ????????});??
- ????}??
- ??
- ??
- ?????
- ?
- ?
- ?
- ??
- ????private?List<SortModel>?filledData(String?[]?date){??
- ????????List<SortModel>?mSortList?=?new?ArrayList<SortModel>();??
- ??????????
- ????????for(int?i=0;?i<date.length;?i++){??
- ????????????SortModel?sortModel?=?new?SortModel();??
- ????????????sortModel.setName(date[i]);??
- ??????????????
- ????????????String?pinyin?=?characterParser.getSelling(date[i]);??
- ????????????String?sortString?=?pinyin.substring(0,?1).toUpperCase();??
- ??????????????
- ??????????????
- ????????????if(sortString.matches("[A-Z]")){??
- ????????????????sortModel.setSortLetters(sortString.toUpperCase());??
- ????????????}else{??
- ????????????????sortModel.setSortLetters("#");??
- ????????????}??
- ??????????????
- ????????????mSortList.add(sortModel);??
- ????????}??
- ????????return?mSortList;??
- ??????????
- ????}??
- ??????
- ?????
- ?
- ?
- ??
- ????private?void?filterData(String?filterStr)?{??
- ????????List<SortModel>?filterDateList?=?new?ArrayList<SortModel>();??
- ??
- ????????if?(TextUtils.isEmpty(filterStr))?{??
- ????????????filterDateList?=?SourceDateList;??
- ????????}?else?{??
- ????????????filterDateList.clear();??
- ????????????for?(SortModel?sortModel?:?SourceDateList)?{??
- ????????????????String?name?=?sortModel.getName();??
- ????????????????if?(name.toUpperCase().indexOf(??
- ????????????????????????filterStr.toString().toUpperCase())?!=?-1??
- ????????????????????????||?characterParser.getSelling(name).toUpperCase()??
- ????????????????????????????????.startsWith(filterStr.toString().toUpperCase()))?{??
- ????????????????????filterDateList.add(sortModel);??
- ????????????????}??
- ????????????}??
- ????????}??
- ??????????
- ??????????
- ????????Collections.sort(filterDateList,?pinyinComparator);??
- ????????adapter.updateListView(filterDateList);??
- ????}??
- ??????
- }??
?
7.PinyinComparator接口用来对ListView中的数据根据A-Z进行排序,前面两个if判断主要是将不是以汉字开头的数据放在后面
?
[java]?view plaincopy
?
- package?com.example.sortlistview;??
- ??
- import?java.util.Comparator;??
- ??
- ?
- ?
- ?
- ?
- ??
- public?class?PinyinComparator?implements?Comparator<SortModel>?{??
- ??
- ????public?int?compare(SortModel?o1,?SortModel?o2)?{??
- ??????????
- ????????if?(o2.getSortLetters().equals("#"))?{??
- ????????????return?-1;??
- ????????}?else?if?(o1.getSortLetters().equals("#"))?{??
- ????????????return?1;??
- ????????}?else?{??
- ????????????return?o1.getSortLetters().compareTo(o2.getSortLetters());??
- ????????}??
- ????}??
- } ?
?
?源码下载地址 :http://www.32666.com/file-582076.html