在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; // 联系人列表的适配器
@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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-z
if (!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();
} else
return 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);
} @Override
public 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;
} @Override
protected 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();
}
}

Android 字母导航条实现的更多相关文章

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

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

  2. ListView 字母导航排序

    一.概述 ListView字母导航排序,网上已经有很多代码和博客了, 这篇博文也是照搬网上的.  之所以写到这里,不是为了说明什么,只是为了以后自己查阅方便.本来公司要求实现expandablelis ...

  3. android开发(1):底部导航条的实现 | navigation tab | activity的创建

    底部导航条,在iOS中叫tabbar,在android中叫bottombar或bottom navigation,是一个常用的切换页面的导航条. 同样,如果有良好的第三方库,我们应该优先考虑,能用好别 ...

  4. Android开发关闭虚拟按钮、底部导航条

    在Android开发中,遇到了一系列大大小小的问题,其中一个就是屏蔽底部实体键,我找了很多的博客也尝试了许许多多的方法,但始终不能屏蔽 HOME键,后来看见一篇博客说在Android 4.0以后,屏蔽 ...

  5. Android 修改TabLayout底部导航条Indicator的长短

    关于Tablayout,使用的应该很频繁了,但是底部导航条长短是固定死的,需要自己来改动长短,找了半天没找着方法,看了下官方建议,可以通过映射来修改自己想要的长短,其实也就几行代码的问题,看代码: p ...

  6. Android自定义组件系列【10】——随ViewPager滑动的导航条

    昨天在用到ViewPager实现滑动导航的时候发现微信的导航条效果是跟随ViewPager的滑动而动的,刚开始想了一下,感觉可以使用动画实现,但是这个滑动是随手指时时变化的,貌似不可行,后来再网上搜了 ...

  7. Android自定义View——实现字母导航栏

    1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 1.先看主布局,方便后面代码的 ...

  8. android通讯录导航栏源码(一)

    通讯录导航栏源码: 1.activity package com.anna.contact.activity; import java.util.ArrayList; import java.util ...

  9. Android底部导航栏——FrameLayout + RadioGroup

    原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6285881.html Android底部导航栏有多种实现方式,本文详细介绍FrameLayout ...

随机推荐

  1. MySQL不能连接本地数据库10061

    可能的原因是本地服务器没有启动,在安装配置MySQL时,我去掉了开机自动开启,所以开机之后出现了错误10061 解决办法: 一.计算机右击选择管理 二.选择服务,找到MySQL,右击手动,选择启动服务

  2. meta-data获取小结

    android 开发中:   在AndroidManifest.xml中,<meta-data>元素可以作为子元素,   被包含在<activity>.<applicat ...

  3. Windows运行机理——创建窗口

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 Windows 窗口在创建之前,其属性必须设定好,所谓属性包括类的名字 ...

  4. SQL注入篇二------利用burp盲注,post注入,http头注入,利用burpsuit找注入点,宽字节注入

    1.布尔盲注burpsuit的使用 先自己构造好注入语句,利用burpsuit抓包,设置变量,查出想要的信息. 比如----查数据库名的ascii码得到数据库构造好语句 http://123.206. ...

  5. SQL语言重点学习

    数据库的操作任务通常包括以下几个方面: 1.查询数据. 2.在表中插入,修改和删除记录. 3.建立,修改和删除数据对象. 4.控制对数据和数据对象的读写. 5.保证数据库一致性和完整性. SQL语言学 ...

  6. [Clr via C#读书笔记]Cp10属性

    Cp10属性 属性的本质就是方法,只是看起来像字段罢了: 无参属性 就是一般属性: 字段一般要private,然后通过设置访问方法-访问器来访问:属性是方法语法变种:getset不一定要访问支持字段: ...

  7. 【MySQL解惑笔记】Navicat 无法远程连接MySQL数据库

    安装好Navicat之后远程连接MySQL数据库出现以下报错截图: 出现以上截图怀疑是mysql用户权限不够: GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.1 ...

  8. LeetCode 142——环形链表 II

    1. 题目 2. 解答 2.1 方法 1 定义快慢两个指针,慢指针每次前进一步,快指针每次前进两步,若链表有环,则快慢指针一定会相遇. 当快慢指针相遇时,我们让慢指针指向头节点,快指针不变,然后每次快 ...

  9. Python 学习笔记之——用 sklearn 对数据进行预处理

    1. 标准化 标准化是为了让数据服从一个零均值和单位方差的标准正态分布.也即针对一个均值为 \(mean\) 标准差为 \(std\) 的向量 \(X\) 中的每个值 \(x\),有 \(x_{sca ...

  10. LeetCode 700——二叉搜索树中的搜索

    1. 题目 2. 解答 如果根节点为空,直接返回 NULL.如果根节点非空,从根节点开始循环查找,直到节点为空. 如果待查找的值大于当前节点值,节点指向右孩子: 如果待查找的值小于当前节点值,节点指向 ...