引入jar包:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.administrator.indexconnectperson.MainActivity"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent" /><TextViewandroid:id="@+id/word"android:layout_width="50dp"android:layout_height="50dp"android:layout_centerInParent="true"android:background="@drawable/bg_word"android:gravity="center"android:text="A"android:textColor="#ffff"android:textSize="20sp"android:visibility="gone" /><LinearLayoutandroid:layout_width="30dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:orientation="vertical"android:paddingTop="20dp"android:background="@drawable/bg_index"android:paddingBottom="20dp"android:layout_margin="10dp"><com.example.administrator.indexconnectperson.ConnectPersonIndexandroid:id="@+id/connect_person_index"android:layout_width="30dp"android:layout_height="match_parent"/></LinearLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><corners android:radius="8dp"/><solid android:color="#88000000"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><corners android:radius="50dp"/><solid android:color="#44000000"/>
</shape>
package com.example.administrator.indexconnectperson;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;/*** Created by Administrator on 2017/5/17.*/public class ConnectPersonIndex extends View {private int itemWidth;private int itemHeight;private String[] words = {"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 Paint paint;private int currentIndex = -1;public ConnectPersonIndex(Context context, AttributeSet attrs) {super(context, attrs);initView();}private void initView() {paint = new Paint();paint.setColor(Color.WHITE);paint.setTextSize(30);paint.setAntiAlias(true);paint.setTypeface(Typeface.DEFAULT_BOLD);//字体加粗}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);itemWidth = getMeasuredWidth();itemHeight = getMeasuredHeight() / words.length;}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:float Y = event.getY();float index = Y / itemHeight;if (index != currentIndex) {currentIndex = (int) index;onIndextListener.onIndexWordListener(words[currentIndex]);}invalidate();break;case MotionEvent.ACTION_UP:currentIndex = -1;invalidate();break;}return true;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);for (int i = 0; i < words.length; i++) {if (currentIndex == i) {paint.setColor(Color.GRAY);} else {paint.setColor(Color.WHITE);}String word = words[i];Rect rect = new Rect();paint.getTextBounds(word, 0, 1, rect);int wordWidth = rect.width();int wordHeight = rect.height();float wordX = itemWidth / 2 - wordWidth / 2;float wordY = itemHeight / 2 + wordHeight / 2 + i * itemHeight;canvas.drawText(word, wordX, wordY, paint);}}private OnIndextListener onIndextListener;public void setOnIndextListener(OnIndextListener onIndextListener) {this.onIndextListener = onIndextListener;}interface OnIndextListener {void onIndexWordListener(String word);}
}
package com.example.administrator.indexconnectperson;import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;/*** Created by Administrator on 2017/5/17.* 把汉字转换成拼音*/public class PinYinUtils {/*** 得到指定汉字的拼音* 注意:不应该被频繁调用,它消耗一定内存* @param hanzi* @return*/public static String getPinYin(String hanzi){String pinyin = "";HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();//控制转换是否大小写,是否带音标format.setCaseType(HanyuPinyinCaseType.UPPERCASE);//大写format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//由于不能直接对多个汉字转换,只能对单个汉字转换char[] arr = hanzi.toCharArray();for (int i = 0; i < arr.length; i++) {if(Character.isWhitespace(arr[i]))continue;//如果是空格,则不处理,进行下次遍历//汉字是2个字节存储,肯定大于127,所以大于127就可以当为汉字转换if(arr[i]>127){try {//由于多音字的存在,单 dan shanString[] pinyinArr = PinyinHelper.toHanyuPinyinStringArray(arr[i], format);if(pinyinArr!=null){pinyin += pinyinArr[0];}else {pinyin += arr[i];}} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();//不是正确的汉字pinyin += arr[i];}}else {//不是汉字,pinyin += arr[i];}}return pinyin;}
}
package com.example.administrator.indexconnectperson;/*** Created by Administrator on 2017/5/17.*/public class Person {private String name;private String pinyin;public Person(String name) {this.name = name;this.pinyin = PinYinUtils.getPinYin(name);}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;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", pinyin='" + pinyin + '\'' +'}';}
}
package com.example.administrator.indexconnectperson;import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class MainActivity extends AppCompatActivity {private ListView listview;private TextView word;private ConnectPersonIndex connectIndex;private Handler mHandler = new Handler();private ArrayList<Person> persons;private MyAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initDatas();initEvent();}private void initView() {listview = (ListView) findViewById(R.id.listview);word = (TextView) findViewById(R.id.word);connectIndex = (ConnectPersonIndex) findViewById(R.id.connect_person_index);}private void initDatas() {persons = new ArrayList<>();persons.add(new Person("刘涛"));persons.add(new Person("蒋欣"));persons.add(new Person("王子文"));persons.add(new Person("杨紫"));persons.add(new Person("乔欣"));persons.add(new Person("祖峰"));persons.add(new Person("王凯"));persons.add(new Person("张陆"));persons.add(new Person("靳东"));persons.add(new Person("杨烁"));persons.add(new Person("张晓谦"));persons.add(new Person("郭晓然"));persons.add(new Person("陈牧扬"));persons.add(new Person("王永泉"));persons.add(new Person("丁勇岱"));persons.add(new Person("宁文彤"));persons.add(new Person("吴昊宸"));persons.add(new Person("穆丽燕"));persons.add(new Person("冯晖"));persons.add(new Person("谭希和"));persons.add(new Person("刘敏涛"));persons.add(new Person("康群智"));persons.add(new Person("岳旸"));persons.add(new Person("赵千紫"));persons.add(new Person("胡伊静"));persons.add(new Person("隋雨蒙"));persons.add(new Person("朱梦瑶"));persons.add(new Person("石云鹏"));persons.add(new Person("安悦溪"));persons.add(new Person("安以轩"));persons.add(new Person("包贝尔"));//排序Collections.sort(persons, new Comparator<Person>() {@Overridepublic int compare(Person lhs, Person rhs) {return lhs.getPinyin().compareTo(rhs.getPinyin());}});adapter = new MyAdapter();listview.setAdapter(adapter);}private void initEvent() {connectIndex.setOnIndextListener(new ConnectPersonIndex.OnIndextListener() {@Overridepublic void onIndexWordListener(String w) {refreshWord(w);refreshName(w);}});}private void refreshName(String w) {for (int i = 0; i < persons.size(); i++) {String word = persons.get(i).getPinyin().substring(0, 1);if (word.equals(w)) {listview.setSelection(i);return;}}}private void refreshWord(String w) {word.setVisibility(View.VISIBLE);word.setText(w);mHandler.removeCallbacksAndMessages(null);mHandler.postDelayed(new Runnable() {@Overridepublic void run() {word.setVisibility(View.GONE);}}, 800);}class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return persons.size();}@Overridepublic Object getItem(int i) {return persons.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder holder = null;if (view == null) {view = View.inflate(MainActivity.this, R.layout.item_main, null);holder = new ViewHolder();holder.pinyin = (TextView) view.findViewById(R.id.pinyin);holder.name = (TextView) view.findViewById(R.id.name);view.setTag(holder);} else {holder = (ViewHolder) view.getTag();}String pinyin = persons.get(i).getPinyin().substring(0, 1);String name = persons.get(i).getName();Log.e("------------", "name: " + name + "pinyin" + pinyin);holder.pinyin.setText(pinyin);holder.name.setText(name);if (i == 0) {holder.pinyin.setVisibility(View.VISIBLE);} else {int prePosition = i - 1;String prePinYin = persons.get(prePosition).getPinyin().substring(0, 1);if (prePinYin.equals(pinyin)) {holder.pinyin.setVisibility(View.GONE);} else {holder.pinyin.setVisibility(View.VISIBLE);}}return view;}class ViewHolder {TextView pinyin;TextView name;}}
}
<?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/pinyin"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#22000000"android:paddingLeft="20dp"android:text="A"android:textColor="#000"android:textSize="18sp" /><TextViewandroid:id="@+id/name"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="20dp"android:text="人人网"android:textColor="#000"android:textSize="20sp" />
</LinearLayout>

android联系人索引相关推荐

  1. android 联系人 中文 排序,Android中文联系人排序及检索补丁的原理

    Android中文联系人排序及检索补丁的原理(090819更新) 2009年4月26日,更新了源码和相关文件 很久以前做了这个补丁,有幸的是朋友们都还算喜爱它,没白费功夫.不少朋友来信问它的原理,现在 ...

  2. 运用单例模式、建造者模式和策略模式实现异步加载Android联系人资料

    学完设计模式很久了,最近又在看Android联系人提供程序的官方文档,于是就想实现一个方便的联系人管理程序demo,而联系人管理程序demo的核心就是要实现一个异步加载联系人资料的类,于是就有了下文. ...

  3. Android联系人Contacts详解

    1.获取联系人详细信息 在(一)中我们只是获取了联系人的ID和NAME,但是这是远远不够的,怎么样获取其他的值呢? public void fetchContactInformation() {Str ...

  4. 仿微信联系人索引列表ListView

    IM 模块中经常用到 字母索引 ListView 来做通讯录 或者称联系人列表, 今天跟大家分享一个仿微信联系人索引列表, 优点是轻量级,简单易懂. 不要任何依赖 , jar包等 效果预览 工程结构 ...

  5. android联系人批量删除优化时间

    android联系人批量删除时总要求效率要高,时间要快.可以对联系人分块删除.以下代码,看看有没有还需要优化的地方. private static Object mLock = new Object( ...

  6. android仿微信联系人索引列表

    前言   因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果.本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太 ...

  7. android 通讯录界面设计带字母,android仿微信联系人索引列表功能

    前言 因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果.本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太复杂 ...

  8. android 联系人 字母索引,Android ListView字母索引(仿微信通訊錄列表)

    布局代碼 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren ...

  9. android 通讯录 编程,以编程方式批量添加数千个Android联系人

    使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次性添加数千个联系人非常慢. Android是否提供了批量添加联系人的不同方式,这种 ...

最新文章

  1. Rails 4:如何使用带有turbo-links的$(document).ready()
  2. libuv 中文编程指南
  3. 解决布局拖动混乱的问题
  4. 使用Maven配置JBoss / Wildfly数据源
  5. 【代码笔记】iOS-自定义loading(IanAlert)
  6. Mybatis(20)注解实现二级缓存
  7. Silverlight C# 游戏开发:L5 3D基本的灯光
  8. java的socket编程---telnet客户端的实现
  9. 妨碍编译器优化的因素
  10. 自定义炫酷效果ViewPage指示器
  11. 几款连接redis的客户端(GUI客户端),下面记录了我使用的几款
  12. SlideShare:大话SSD (淘宝核心系统数据库组 褚霸)
  13. 英文论文如何进行润色?
  14. qq拼音 搜狗拼音的对比
  15. 《网络黑白》一书所抄袭的文章列表
  16. 软件推荐:强力卸载软件HIBIT
  17. 水果fl studio21最新中文注册版安装教程
  18. Java实现编辑图片并添加文字
  19. 以太猫合约之数据合约分析(二)
  20. 佳能MG3600系列打印机如何更换连接WiFi

热门文章

  1. mysql 备份多个库_使用mysqldump备份多个库
  2. python进行机器学习(四)之模型验证与参数选择
  3. 系统服务器性能巡检报告,pc服务器巡检报告
  4. 从知识女性转变为家庭妇女
  5. 为什么没有参数的函数(与实际函数定义相比)会编译?
  6. java特征向量计算_Java与Python计算特征向量的区别
  7. 如何实现修改c语言题库,编程培训 所有C语言题库(修改后).docx
  8. 字符串与Date类型相互转换
  9. 引入阿里云SDK,类找不到的问题
  10. OSPF为何需要loopback接口