引入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>