android联系人索引



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


猜你喜欢

转载自blog.csdn.net/qq_35828720/article/details/72433125