导入依赖,或者自行百度下载jar包 compile 'com.belerweb:pinyin4j:2.5.0'

一、创建布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:scrollbars="none"></ListView><com.test.tong.CustomViewandroid:id="@+id/customView"android:layout_width="30dp"android:layout_height="match_parent"android:layout_marginBottom="5dp"android:layout_marginTop="5dp" /></LinearLayout>listView中的Item的布局<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/item_word"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#c5bebe"android:padding="5dp"android:textSize="25sp" /><TextViewandroid:id="@+id/item_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="5dp"android:textSize="20sp" /></LinearLayout>

二、在ManiActivity中模拟人名,查找控件,设置适配器和一些监听等操作

public class MainActivity extends AppCompatActivity {String[] NAMES = new String[]{"宋江", "卢俊义", "吴用","公孙胜", "关胜", "林冲", "秦明", "呼延灼", "花荣", "柴进", "李应", "朱仝", "鲁智深","武松", "董平", "张清", "杨志", "徐宁", "索超", "戴宗", "刘唐", "李逵", "史进", "穆弘","雷横", "李俊", "阮小二", "张横", "阮小五", "张顺", "阮小七", "杨雄", "石秀", "解珍","解宝", "燕青", "朱武", "黄信", "孙立", "宣赞", "郝思文", "韩滔", "彭玘", "单廷珪","魏定国", "萧让", "裴宣", "欧鹏", "邓飞", "燕顺", "杨林", "凌振", "蒋敬", "吕方","郭 盛", "安道全", "皇甫端", "王英", "扈三娘", "鲍旭", "樊瑞", "孔明", "孔亮", "项充","李衮", "金大坚", "马麟", "童威", "童猛", "孟康", "侯健", "陈达", "杨春", "郑天寿","陶宗旺", "宋清", "乐和", "龚旺", "丁得孙", "穆春", "曹正", "宋万", "杜迁", "薛永", "施恩","周通", "李忠", "杜兴", "汤隆", "邹渊", "邹润", "朱富", "朱贵", "蔡福", "蔡庆", "李立","李云", "焦挺", "石勇", "孙新", "顾大嫂", "张青", "孙二娘", "王定六", "郁保四", "白胜","时迁", "段景柱", "易宸锋"};private ListView listview;private CustomView custom;private ArrayList<person> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listview = (ListView) findViewById(R.id.listview);custom = (CustomView) findViewById(R.id.customView);list = new ArrayList<>();for (int i = 0; i < NAMES.length; i++) {list.add(new person(NAMES[i]));}//设置适配器listview.setAdapter(new MyAdaper(list, this));//对list集合中的首字母进行排序Collections.sort(list, new Comparator<person>() {@Overridepublic int compare(person o1, person o2) {return o1.getHanderWord().compareTo(o2.getHanderWord());}});//自定义接口回调,拿到你点击的拼音导航custom.getDownData(new CustomView.DownData() {@Overridepublic void DownData(String str) {//循环判断点击的拼音导航栏和集合中姓名的首字母,如果相同Listview就跳转显示for (int i = 0; i < list.size(); i++) {if (list.get(i).getHanderWord().equals(str)) {listview.setSelection(i);break;//此处记得一定要停止循环,否则会下标错乱}}}});}
}

三、ListView的适配器

public class MyAdaper extends BaseAdapter {private List<person> list;private Context context;public MyAdaper(List<person> list, Context context) {this.list = list;this.context = context;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = View.inflate(context, R.layout.item, null);holder = new ViewHolder();holder.word = (TextView) convertView.findViewById(R.id.item_word);holder.name = (TextView) convertView.findViewById(R.id.item_name);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}String handerWord = list.get(position).getHanderWord();holder.word.setText(handerWord);//显示首字母导航,A,B,C...holder.name.setText(list.get(position).getName());//显示姓名//第一个字母显示if (position == 0) {holder.word.setVisibility(View.VISIBLE);} else {//然后判断当前姓名的首字母和上一个首字母是否相同,如果相同字母导航条就影藏,否则就显示if (handerWord.equals(list.get(position - 1).getHanderWord())) {holder.word.setVisibility(View.GONE);} else {holder.word.setVisibility(View.VISIBLE);}}return convertView;}class ViewHolder {TextView word;TextView name;}
}

四、自定义View展示右侧的名字首字母

public class CustomView extends View {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"};Paint paint = new Paint();public CustomView(Context context) {super(context);}public CustomView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//计算每一个字母的高度,总告诉除以字母集合的高度就可以int height = (getHeight()) / b.length;for (int i = 0; i < b.length; i++) {paint.setColor(Color.parseColor("#ff0000"));paint.setAntiAlias(true);//设置抗锯齿//设置文字大小paint.setTextSize(40);//设置字体加粗paint.setTypeface(Typeface.DEFAULT_BOLD);//计算每一个字母VIew的x轴坐标float paintX = getWidth() / 2 - paint.measureText(b[i]) / 2;//计算每一个字母的高度int paintY = height * i + height;//绘画出来这个TextViewcanvas.drawText(b[i], paintX, paintY, paint);//画完一个以后重置画笔paint.reset();}}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:int down = (int) (event.getY() / getHeight() * b.length);if (down >= 0 && down < b.length) {downData.DownData(b[down]);}break;case MotionEvent.ACTION_MOVE:int move = (int) (event.getY() / getHeight() * b.length);if (move >= 0 && move < b.length) {downData.DownData(b[move]);}break;}return true;}private DownData downData;public void getDownData(DownData downData) {this.downData = downData;}public interface DownData {void DownData(String str);}
}

五、创建JavaBean来保存得到的姓名的拼音和拼音的首字母

 
public class person {private String name;private String pinyin;private String handerWord;public person(String name) {this.name = name;char c = name.charAt(0);//拿到姓名的第一个汉字this.pinyin = PinyinHelper.toHanyuPinyinStringArray(c)[0];//拿到名字的第一个汉字的拼音this.handerWord = pinyin.substring(0, 1).toUpperCase();//汉字拼音的首字母,变成大写}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPinyin() {return pinyin;}public void setPinyin(String pinyin) {this.pinyin = pinyin;}public String getHanderWord() {return handerWord;}public void setHanderWord(String handerWord) {this.handerWord = handerWord;}
}

Android 通讯录的实现,根据拼音首字母快速索引到名字相关推荐

  1. JS获取中文拼音首字母,并通过拼音首字母快速查找页面内的中文内容

    实现效果: 图一: 图二: 此例中输入的中文字符串"万万保重",有三个字是多音字,所以alert对话框中显示的是多种读音的组合: 如何实现? 如何实现通过拼音首字母快速查找页面内的 ...

  2. js获取汉字的拼音首字母

    前言 参考<JS获取中文拼音首字母,并通过拼音首字母快速查找页面内的中文内容> 自己写的在线示例

  3. 简单实现通讯录中文名字按拼音首字母排序

    <body> <div class="address"> <div class="address_title">通讯录< ...

  4. Android 利用AutoCompleteTextView实现模糊搜索功能,搜索结果自动提示,识别拼音首字母并转汉字提示

    这里说一下怎么利用 Android 的 AutoCompleteTextView 控件实现模糊搜索功能,AutoCompleteTextView 自带自动提示功能.如果 对自动提示的布局自定义要求比较 ...

  5. android 获取拼音首字母,Android开发 - 汉字转拼音首字母

    概述 工作中经常会遇到的一些排序问题,比如 按汉字的拼音首字母排序,比如人名排序等,就要用到下面的方法了,思路: 1.获得汉字 2.将汉字转换成首字母,并记录下(必要时保存到数据库) 3.按首字母进行 ...

  6. js汉字转拼音首字母

    转载自:https://funteas.com/topic/5acb6bff7be5304e6850cffa 一.实现功能 汉字转拼音首字母 二.业务场景 在写即时通讯时必然要做通讯录(联系人列表), ...

  7. Oracle中根据中文获取拼音首字母

    前言 在软件中方便用户查找信息时,都会用到输拼音首字母的简写快速过滤,所以一般我们在Oracle的表中会加上一列助记符列,今天我们就看看将中文怎么转换为拼音首字母. 实现方式 通过oracle的NLS ...

  8. 城市列表-根据拼音首字母排序

    今天我们就简单的实现一下城市的排序 读取我们城市的信息并通过listview展示 首先看一下我们的布局文件 <LinearLayout xmlns:android="http://sc ...

  9. 【C#】获取汉字拼音首字母和全拼

    文章目录 利用CJK统一表意符号获取首字母 获取首字母和全拼 另附sql server解决方案 来源 java的同学可以了解下pinyin4j,js可以了解ChinesePY.js 获取拼音的意义多在 ...

  10. iOS获取汉字拼音首字母的方法

    iOS获取汉字拼音首字母的方法 之前在项目中需要根据昵称的首字母进行排序,蹚了几个坑,今天记录一下.其实iOS系统封装的就有获取汉字首字母的方法,但不推荐,想看最优解的同学直接略过: var name ...

最新文章

  1. 通过tinyxml解析百度热词榜单
  2. 差分约束问题 ---- 2019ccpc哈尔滨A. Artful Paintings[二分+差分约束+建图剪枝]
  3. ListView 常用属性
  4. 002 通过send断点分析功能call
  5. 借助Spring站点开始一个spring项目
  6. 利用css布局效果图
  7. C语言试题十九之根据以下公式求p的值,结果由函数值带回。M与n为两个正整数,且要求m>n。 p=m!/n!(m-n)!
  8. 深度:关于Linux内核最硬核的文章
  9. Linux系统出现验证码乱码的原因及解决办法
  10. ★LeetCode(812)——最大三角形面积(JavaScript)
  11. cad导出pdf_CAD手机看图软件中怎么将CAD图纸转为PDF/图片格式?
  12. 网页上的在线打印如何下载成本地PDF格式(人工亲测)
  13. CMD 命令行实现 Windows 下复制文件到文件夹下的所有文件夹
  14. Error:Attempt to invoke virtual method ‘void android.widget.TextView.setText(java.lang.CharSeq
  15. 程序员都会的五大算法之三(贪心算法),恶补恶补恶补!!!
  16. 华为magic ui就是鸿蒙系统,Magic UI系统是什么?Magic UI和EMUI的区别
  17. would用法归纳(最全)
  18. 论文笔记:《Object-Aware Guidance for Autonomous Scene Reconstruction》
  19. Frontline软件CPAS
  20. IP数据报的发送和转发过程

热门文章

  1. BoltDB学习笔记
  2. 清华梦的粉碎—写给清华大学的退学申请 /王垠
  3. 精华 | 网络故障排除命令汇总【网工必须收藏】
  4. java连接HDFS+Kerberos配置参数示例
  5. Android persistent机制
  6. css样式的灵异事件
  7. Code Review之前中后
  8. quot;紫陀螺quot;网友感触转载系列之…
  9. 电脑上的网站服务器在哪里能看到,怎么样查看windows电脑服务器IP地址
  10. Vue中$emit()方法和props属性的区别与应用