在Activity中进行功能的实现,需要用到第三方jar包:pinyin4j.jar,此jar包用于将汉字转换为汉语拼音。

首先,设置右侧边栏索引列表(A-Z),并且设置列表点击,Touch事件,点击索引,如果在内容列表中存在对应的数据,则自动跳转显示到那一条数据,如果没有则不处理,长按的时候在内容列表中显示当前选择了哪一项;
获取内容列表list,并且获取此列表中联系人对象的名字所对应的第一个字母,将所有的联系人名字第一个字母取出(无重复),然后将两个列表合并,最后根据联系人或者是联系人组目录拼音进行排序比较;

public class ContactsActivity extends Activity {private TextView tv_center = null;private ListView content; // 左边的联系人列表private ListView lvseek; // 右边的索引列表private HanyuPinyinOutputFormat spellFormat; // 转换汉字得到其汉语拼音private List<String> index_list = new ArrayList<String>(); // 联系人列表的组索引列表private ContactsAdapter adapter; // 联系人列表的适配器@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.contacts);init();}/*** 初始化变量*/private void init() {lvseek = (ListView) findViewById(R.id.layout);tv_center = (TextView) findViewById(R.id.tv);spellFormat = new HanyuPinyinOutputFormat();spellFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);spellFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);spellFormat.setVCharType(HanyuPinyinVCharType.WITH_V);content = (ListView) findViewById(R.id.listView1);setContent(content);setLvSeekAdapter(lvseek);setLvSeekListener(lvseek);}/*** 设置索引列表的数据源适配器* * @param lvseek2*/private void setLvSeekAdapter(ListView lvseek2) {AZAdapter adapter = new AZAdapter(this, getList());int per_height = getResources().getDisplayMetrics().heightPixels / 26;adapter.setHeight(per_height);lvseek2.setAdapter(adapter);}/*** 设置seekLv事件响应* * @param lvseek2*/private void setLvSeekListener(final ListView lvseek2) {// Touch事件,按下和放开两个事件处理lvseek2.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) {tv_center.setVisibility(View.INVISIBLE);lvseek2.setBackgroundColor(Color.parseColor("#FDFDFD"));} else if (event.getAction() == MotionEvent.ACTION_DOWN) {lvseek2.setBackgroundColor(Color.parseColor("#F2F1F0"));}return false;}});// 长按的时候在屏幕中间显示当前选择的是哪一个索引项lvseek2.setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {String str = (String) parent.getAdapter().getItem(position);tv_center.setVisibility(View.VISIBLE);tv_center.setText(str);int index = adapter.getItemIndex(str);if (index != -1)content.setSelection(index);return false;}});lvseek2.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {String str = (String) parent.getAdapter().getItem(position);int index = adapter.getItemIndex(str);if (index != -1)content.setSelection(index);}});}/*** 将内容添加到列表* * @param content2*/private void setContent(ListView content2) {adapter = new ContactsAdapter(this, getList_content());content2.setAdapter(adapter);}// 李四, 王五, 张三, 赵六private List<Object> getList_content() {List<Object> list = new ArrayList<Object>();List<Contact> contact_list = new ArrayList<Contact>();contact_list.add(new Contact("张三", null, ""));contact_list.add(new Contact("李四", null, ""));。。。// 将联系人添加进列表
        list.addAll(contact_list);// 获取联系人索引列表
        getIndex_List(contact_list);// 将索引列表添加进list;
        list.addAll(index_list);Collections.sort(list, new PinyinComparator());return list;}/*** 根据联系人列表获取索引* * @param list*/private void getIndex_List(List<Contact> list) {for (Contact con : list) {String pinying = PinyinHelper.toHanyuPinyinString(con.getName(),spellFormat, "");String first_s = pinying.substring(0, 1);String str = first_s.toUpperCase();if (isA_Z(str)) {// 首字母是a-zif (!index_list.contains(str)) {index_list.add(str);}}}}class PinyinComparator implements Comparator<Object> { // 比较器,在内容列表中有两种类型的数据,所以定义为Object;public int compare(Object o1, Object o2) {String str1;String str2;if (o1.getClass() == Contact.class) {str1 = ((Contact) o1).getName();} else {str1 = o1.toString();}if (o2.getClass() == Contact.class) {str2 = ((Contact) o2).getName();} else {str2 = o2.toString();}return chineneToSpell(str1).compareTo(chineneToSpell(str2));}/*** 使用PinYin4j.jar将汉字转换为拼音* * @param chineseStr* @return*/private String chineneToSpell(String chineseStr) {if (isChinese(chineseStr)) {String pinying = PinyinHelper.toHanyuPinyinString(chineseStr, spellFormat, "");return pinying.toUpperCase();} elsereturn chineseStr;}}/*** 加载右边显示栏* * @return*/private List<String> getList() {return Arrays.asList(Utils.RIGHT_INDEX);}
}

至此基本功能已经实现;
补充:最近在学习的过程中,发现了另一种方式,相比前一种方式,更加合理,记录如下:

public class MyTrackView extends View {private OnTrackListener listener;private String bg = "#40000000";private boolean showbg = false;private Paint paint = new Paint();private String[] b = new String[] { "#", "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;public MyTrackView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public MyTrackView(Context context, AttributeSet attrs) {super(context, attrs);}public MyTrackView(Context context) {super(context);}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {int item = (int) (event.getY() / getHeight() * b.length);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (item >= 0 && item < b.length) {showbg = true;choose = item;invalidate();if (listener != null) {listener.getStr(b[item]);}}break;case MotionEvent.ACTION_MOVE:if (item >= 0 && item < b.length) {showbg = true;choose = item;invalidate();if (listener != null) {listener.getStr(b[item]);}}break;case MotionEvent.ACTION_UP:showbg = false;choose = -1;invalidate();if (listener != null) {listener.getStr(-1 + "");}break;}return true;}@Overrideprotected void onDraw(Canvas canvas) {int singleHeight = getHeight() / b.length;if (showbg) {canvas.drawColor(Color.parseColor(bg));}for (int i = 0; i < b.length; i++) {paint.setColor(Color.WHITE);paint.setAntiAlias(true);float textWidth = paint.measureText(b[i]);if (i == choose) {paint.setColor(Color.RED);paint.setFakeBoldText(true);}canvas.drawText(b[i], (getWidth() - textWidth) / 2, (i + 1)* singleHeight, paint);paint.reset();}super.onDraw(canvas);}public void setTrackListener(OnTrackListener listener) {this.listener = listener;}interface OnTrackListener {public void getStr(String str);}
}

利用pinyin.jar轻松将汉字转换为拼音

public class Main{private HanyuPinyinOutputFormat spellFormat; // 转换汉字得到其汉语拼音
public Main() {spellFormat = new HanyuPinyinOutputFormat();spellFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);spellFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);spellFormat.setVCharType(HanyuPinyinVCharType.WITH_V);Log.e(chineneToSpell("大家好"), "fuck");}/*** 使用PinYin4j.jar将汉字转换为拼音* * @param chineseStr* @return*/private String chineneToSpell(String chineseStr) {if (isChinese(chineseStr)) {String pinying = PinyinHelper.toHanyuPinyinString(chineseStr,spellFormat, "");return pinying.toUpperCase();}return chineseStr;}/*** 判断字符串中是否包含有中文* * @param str* @return*/protected static boolean isChinese(String str) {String regex = "[\\u4e00-\\u9fa5]";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(str);return matcher.find();}/*** 判断是否是a-z* * @param str* @return*/protected static boolean isA2Z(String str) {String regex = "[A-Za-z]";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(str);return matcher.find();}
}

转载于:https://www.cnblogs.com/a284628487/p/3148299.html

Android 字母导航条实现相关推荐

  1. Android实现首字母导航条(仿微信)

    本博客介绍Android实现首字母导航条,先看张效果图,具体怎么实现看代码吧 具体的步骤 1.整体布局的显示 2. 实现A-Z的分组 3. 自定义A-Z的导航条 4. 中间显示/隐藏触摸到导航条具体的 ...

  2. VS 2015 开发Android底部导航条----[实例代码,多图]

    1.废话背景介绍  在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中. 这也就是说,Xamarin将免费提供给所有购买了Visual St ...

  3. android上方导航条跳转页面,《成为大前端》系列 7. 多页面、页面跳转和Navigation模块...

    介绍 开发过移动 Web 页面的同学都知道,单个页面由客户端的 UI 所承载,页面间的跳转也 不再是使用 window 和 location,也不是使用 a 标签,而且调用 Native 写好的 br ...

  4. Android字母导航示例

    文章转自:http://blog.csdn.net/qq_26787115/article/details/52502787 论字母导航的重要性,我们来实现一个联系人字母导航列表吧! 说起这个字母导航 ...

  5. android上方导航条跳转页面,Native Navigation导航组件的使用说明

    目前稳定版本为1.0版本, 2.0是开发版, 暂时不要用. 支持单页直接跳转, 直接自带顶部导航栏配置(返回,标题栏和右侧按钮), 支持直接跳转到多Tab页面, 支持隐藏显示Tab页, 支持数字气泡. ...

  6. android listview 导航条,Android侧边导航栏+ListView基础实践

    Android基础项目实践 文章首发于自己的github博客,https://lemonjuice98.github.io/ 本学期学习了Android的开发课程,期末也做了一款很萌新向的App作为课 ...

  7. android导航条高度修改,Android中修改TabLayout底部导航条Indicator长短的方法

    前言 对于Tablayout相信大家都不陌生,在开发中使用的应该很频繁了,但是底部导航条长短是固定死的,需要自己来改动长短,找了半天没找着方法,看了下官方建议,可以通过映射来修改自己想要的长短,其实也 ...

  8. android底部导航栏svg,vue开发移动端底部导航条功能

    效果图 src/app.vue 头部导航 内容区域 import Tabbar from 'components/tabbar'; export default { name: 'App', comp ...

  9. 爱奇艺首页底部导航按钮android,仿爱奇艺/腾讯视频ViewPager导航条实现

    仿爱奇艺/腾讯视频ViewPager导航条实现,支持自定义导航条高度,宽度,颜色变化,字体大小变化.支持多种滚动模式,支持自定义每个TabView的样式.项目地址:https://github.com ...

最新文章

  1. GitHub开源蔡徐坤打篮球
  2. Java项目:在线美食网站系统(java+SSM+jsp+mysql+maven)
  3. centos 查找nginx_centos7 nginx安装/启动/进程状态/杀掉进程
  4. Linux生产环境CPU占用过高排查步骤
  5. Spark3.0发布了,代码拉过来,打个包,跑起来!| 附源码编译
  6. python消费kafka逻辑处理导致cpu升高_大数据技术之一次KAFKA消费者异常引起的思考...
  7. TPT:中科院等提出用于VideoQA的跨模态交互时间金字塔Transformer
  8. centos安装django
  9. python程序设计基础试题及答案_智慧职教2020Python程序设计基础题目及答案
  10. success.php
  11. 苹果4s刷linux,苹果4s降级教程【图解】
  12. 中国大陆身份证号码验证及身份证信息获取,数据来源于国家标准GB/T 2260-2007
  13. 幂函数展开c语言,第三章幂函数展开.pdf
  14. 使命召唤手游显示服务器停服,使命召唤手游停服了吗 是手游还是端游
  15. 华为太极magisk安装教程_【玩机必会技能】小米手机通用刷TWRP RECOVERY|ROOT|刷第三方ROM教程...
  16. 信息系统开发与管理第一遍总结
  17. h5调用指纹识别_HTML5 + JS 网站追踪技术:帆布指纹识别 Canvas FingerPrinting Universally Unique Identifier,简称UUID...
  18. 优质的草图大师素材 草图66!
  19. 基于RK3399的机器人控制主板
  20. python基础学习_01变量

热门文章

  1. linux ping不允许的操作,Alpine ping:不允许操作
  2. 网页输入数据到mysql_为什么用PHP编写的网页中,输入的数据不能插入到Mysql数据库中?...
  3. php if k 1,PHP实现大数字格式化成K/M/B结尾的简短形式
  4. 浙江大学_包家立教授_计算生物学3_贝叶斯算法
  5. wsgiserver python 漏洞_python-简单测试wsgi
  6. ireport怎么套打_柳州男孩小指被螺母套牢,还有熊娃被卡进这地方!消防员笑抽,网友:日常打“卡”...
  7. 利用Python进行数据分析--数据规整化:清理、转换、合并、重塑
  8. 数据挖掘的数据集资源
  9. 如何用互联网思维搞定零售业
  10. etl spring_山寨一个Spring的@Component注解