Android开发读取通讯录信息
生活随笔
收集整理的這篇文章主要介紹了
Android开发读取通讯录信息
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
需求
通過搜索聯(lián)系人的姓名獲取相應(yīng)的詳細(xì)人信息,也可通過右側(cè)字母條搜索相應(yīng)的聯(lián)系人信息。
主要代碼如下:
MainActivity
SortAdapter
public class SortAdapter extends BaseAdapter implements SectionIndexer {private List<ContactsBean> list = null;private Context mContext;private OnClicker onClicker;public SortAdapter(Context mContext, List<ContactsBean> list) {this.mContext = mContext;this.list = list;}/*** 當(dāng)ListView數(shù)據(jù)發(fā)生變化時(shí),調(diào)用此方法來更新ListView** @param list*/public void updateListView(List<ContactsBean> list) {this.list = list;notifyDataSetChanged();}public int getCount() {return this.list.size();}public Object getItem(int position) {return list.get(position);}public long getItemId(int position) {return position;}public View getView(final int position, View view, ViewGroup arg2) {ViewHolder viewHolder = null;final ContactsBean mContent = list.get(position);if (view == null) {viewHolder = new ViewHolder();view = LayoutInflater.from(mContext).inflate(R.layout.contacts_item, null);viewHolder.rlContacts = view.findViewById(R.id.rl_contacts);viewHolder.tvTitle = view.findViewById(R.id.tv_contacts_item_title);viewHolder.tvLetter = view.findViewById(R.id.tv_contacts_item_catalog);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}//根據(jù)position獲取分類的首字母的Char ascii值int section = getSectionForPosition(position);//如果當(dāng)前位置等于該分類首字母的Char的位置 ,則認(rèn)為是第一次出現(xiàn)if (position == getPositionForSection(section)) {viewHolder.tvLetter.setVisibility(View.VISIBLE);viewHolder.tvLetter.setText(mContent.getSortLetters());} else {viewHolder.tvLetter.setVisibility(View.GONE);}final String mobile = this.list.get(position).getPhone().replaceAll(" ", "").replaceAll("\\+", "").replaceAll("-", "");viewHolder.tvTitle.setText(this.list.get(position).getName());viewHolder.rlContacts.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {onClicker.onClik(list.get(position).getName(), mobile);}});return view;}final static class ViewHolder {private TextView tvLetter,//首字母tvTitle;//名字private RelativeLayout rlContacts;//tvIsImpower;//是否授權(quán)}/*** 根據(jù)ListView的當(dāng)前位置獲取分類的首字母的Char ascii值*/public int getSectionForPosition(int position) {return list.get(position).getSortLetters().charAt(0);}/*** 根據(jù)分類的首字母的Char ascii值獲取其第一次出現(xiàn)該首字母的位置*/public int getPositionForSection(int section) {for (int i = 0; i < getCount(); i++) {String sortStr = list.get(i).getSortLetters();char firstChar = sortStr.toUpperCase().charAt(0);if (firstChar == section) {return i;}}return -1;}public void setOnCliker(OnClicker onClicker) {this.onClicker = onClicker;}/*** 提取英文的首字母,非英文字母用#代替。** @param str* @return*/private String getAlpha(String str) {String sortStr = str.trim().substring(0, 1).toUpperCase();// 正則表達(dá)式,判斷首字母是否是英文字母if (sortStr.matches("[A-Z]")) {return sortStr;} else {return "#";}}@Overridepublic Object[] getSections() {return null;}public interface OnClicker {void onClik(String name, String phone);} }SideLetterUtil
public class SideLetterUtil extends View {// 觸摸事件private OnTouchingLetterChangedListener onTouchingLetterChangedListener;public static String[] b = {"常用", "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 int choose = -1;// 選中private Paint paint = new Paint();private TextView mTextDialog;private Context context;public void setTextView(TextView mTextDialog) {this.mTextDialog = mTextDialog;// this.mTextDialog.setTextColor(getResources().getColor(R.color.primary_green));}public SideLetterUtil(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.context = context;}public SideLetterUtil(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;}public SideLetterUtil(Context context) {super(context);this.context = context;}/*** 重寫這個(gè)方法*/protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 獲取焦點(diǎn)改變背景顏色.int height = getHeight();// 獲取對(duì)應(yīng)高度int width = getWidth(); // 獲取對(duì)應(yīng)寬度int singleHeight = height / b.length;// 獲取每一個(gè)字母的高度for (int i = 0; i < b.length; i++) {paint.setColor(Color.rgb(33, 65, 98));paint.setColor(getResources().getColor(R.color.primary_green));paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setAntiAlias(true);paint.setTextSize(DensityUtil.dp2px(context, 8));// 選中的狀態(tài)if (i == choose) {paint.setColor(Color.parseColor("#3399ff"));paint.setFakeBoldText(true);}// x坐標(biāo)等于中間-字符串寬度的一半.float xPos = width / 2 - paint.measureText(b[i]) / 2;float yPos = singleHeight * i + singleHeight;canvas.drawText(b[i], xPos, yPos, paint);paint.reset();// 重置畫筆}}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {final int action = event.getAction();final float y = event.getY();// 點(diǎn)擊y坐標(biāo)final int oldChoose = choose;final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;final int c = (int) (y / getHeight() * b.length);// 點(diǎn)擊y坐標(biāo)所占總高度的比例*b數(shù)組的長(zhǎng)度就等于點(diǎn)擊b中的個(gè)數(shù).switch (action) {case MotionEvent.ACTION_UP:setBackgroundDrawable(new ColorDrawable(0x00000000));choose = -1;//invalidate();if (mTextDialog != null) {mTextDialog.setVisibility(View.INVISIBLE);}break;default:setBackgroundResource(R.drawable.sidebar_background);if (oldChoose != c) {if (c >= 0 && c < b.length) {if (listener != null) {listener.onTouchingLetterChanged(b[c]);}if (mTextDialog != null) {mTextDialog.setText(b[c]);mTextDialog.setVisibility(View.VISIBLE);}choose = c;invalidate();}}break;}return true;}/*** 向外公開的方法** @param onTouchingLetterChangedListener*/public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;}/*** 接口*/public interface OnTouchingLetterChangedListener {public void onTouchingLetterChanged(String s);}}效果圖
- 源碼: Android開發(fā)讀取通訊錄信息
總結(jié)
以上是生活随笔為你收集整理的Android开发读取通讯录信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 瀚高数据库企业版中的权限问题
- 下一篇: 小区停车场设计方案