Android手机联系人快速索引(手机通讯录)

最近需要实现一个手机通讯录的快速索引功能。根据姓名首字母快速索引功能,下面通过本篇文章给大家介绍Android手机联系人快速索引(手机通讯录)的相关代码,需要的朋友参考下

最近需要实现一个手机通讯录的快速索引功能。根据姓名首字母快速索引功能。下面是一个手机联系人快速索引的效果,总体来说代码不算难,拼音转换的地方略有复杂。下面上源码:源码中有注释。

下面是效果图:

MainActivity:

 import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; /** * 这里是主布局 * @author lxd * */ public class MainActivity extends Activity { private ListView lv_main; private FriendAdapter adapter; private List data = new ArrayList(); private QuickIndexView qiv_main; private TextView tv_main_word; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { //隐藏word tv_main_word.setVisibility(View.GONE); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv_main = (ListView) findViewById(R.id.lv_main); qiv_main = (QuickIndexView) findViewById(R.id.qiv_main); tv_main_word = (TextView) findViewById(R.id.tv_main_word); //设置监听 qiv_main.setOnIndexChangedListener(new QuickIndexView.OnIndexChangedListener() { @Override public void onIndexChanged(String word) { tv_main_word.setText(word); tv_main_word.setVisibility(View.VISIBLE); //handler.removeMessages(1); //移除未处理的消息 handler.removeCallbacksAndMessages(null); //发延迟消息 handler.sendEmptyMessageDelayed(1, 2000); //滑动listview //查找对应的item for(int i=0;i

主布局:

   

Item:

   

自定义View:

 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * 这里是自定义View * @author lxd * */ public class QuickIndexView extends View { private float itemWidth; private float itemHeight; // private float wordWidth; // private float wordHeight; private String[] indexArr = { "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; public QuickIndexView(Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(16); paint.setAntiAlias(true); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); itemWidth = this.getMeasuredWidth(); itemHeight = this.getMeasuredHeight() / 26f; } @Override protected void onDraw(Canvas canvas) { //当每次触发重绘的时候,就把26个字母循环一遍 for (int i = 0; i  25) { index = 25; } if (index <0) { index = 0; } // 如果下标有改变, 强制重绘 if (index != touchIndex) { // 更新touchIndex touchIndex = index; // 强制重绘 invalidate(); // 通知Activity更新TextView if (onIndexChangedListener != null) { onIndexChangedListener.onIndexChanged(indexArr[index]); } } break; case MotionEvent.ACTION_UP: touchIndex = -1; // 强制重绘 invalidate(); // 通知Activity更新TextView if (onIndexChangedListener != null) { onIndexChangedListener.onUp(); } break; default: break; } return true;// 所有的事件都由当前视图消费 } private OnIndexChangedListener onIndexChangedListener; /* * 设置监听对象的方法 这个方法一般是Activity调用 */ public void setOnIndexChangedListener( OnIndexChangedListener onIndexChangedListener) { this.onIndexChangedListener = onIndexChangedListener; } interface OnIndexChangedListener { // 当操作的下标改变时自动调用 public void onIndexChanged(String word); // 当up时调用 public void onUp(); } }

联系人类:

 /** * 联系人类 * @author lxd * */ public class Friend implements Comparable { private String name; private String pinyin; public Friend(String name) { super(); this.name = name; 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 "Friend [name=" + name + ", pinyin=" + pinyin + "]"; } @Override public int compareTo(Friend another) { return this.pinyin.compareTo(another.getPinyin()); } } 

工具类:用于将汉字转换为拼音

 /** * 将汉字转换为拼音 * @author lxd * */ 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 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; } }

以上代码是关于Android手机联系人快速索引(手机通讯录)的全部叙述,希望大家喜欢。

以上就是Android手机联系人快速索引(手机通讯录)的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 移动