引入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">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android: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" />
<LinearLayout
android: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.ConnectPersonIndex
android: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);//字体加粗
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
itemWidth = getMeasuredWidth();
itemHeight = getMeasuredHeight() / words.length;
}
@Override
public 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;
}
@Override
protected 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 shan
String[] 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;
}
@Override
public 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;
@Override
protected 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>() {
@Override
public 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() {
@Override
public 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() {
@Override
public void run() {
word.setVisibility(View.GONE);
}
}, 800);
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return persons.size();
}
@Override
public Object getItem(int i) {
return persons.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public 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">
<TextView
android: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" />
<TextView
android: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>