android通讯录demo

  • 视频演示
    • 主要代码实现类
    • 界面样式
    • 项目下载链接

视频演示

android通讯录

主要代码实现类

MainActivity

package com.example.maillist;import android.os.Bundle;
import android.util.Log;import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.example.maillist.adapter.CommonAdapter;
import com.example.maillist.adapter.CommonViewHolder;
import com.example.maillist.bean.TitleBean;
import com.example.maillist.bean.UserBean;
import com.example.maillist.utils.CharacterParser;
import com.example.maillist.utils.PinyinComparator;
import com.example.maillist.utils.StringUtil;
import com.example.maillist.widget.SideBar;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MainActivity extends AppCompatActivity {private RecyclerView rv;private SideBar sidrbar;CommonAdapter<Object> adapter;List<Object> mList = new ArrayList<>();CharacterParser characterParser;PinyinComparator pinyinComparator;private Map<String, Integer> scroolToMap = new HashMap<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {characterParser = new CharacterParser();pinyinComparator = new PinyinComparator();rv = (RecyclerView) findViewById(R.id.rv);sidrbar = (SideBar) findViewById(R.id.sidrbar);initAdapter();initListener();}private void initListener() {//设置右侧触摸监听sidrbar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {@Overridepublic void onTouchingLetterChanged(String s) {Log.e("onTouchingLetter", "onTouchingLetter" + s);//该字母首次出现的位置int position = -1;try {position = scroolToMap.get(s);if (position != -1) {linearLayoutManager.scrollToPositionWithOffset(position, 0);}} catch (Exception e) {e.printStackTrace();//  ToolUtil.ToastMessage("连接失败",ToolUtil.WRONG);//    ToastUtil.ToastMessage(CityChooseActivity.this, "连接失败");}}});}LinearLayoutManager linearLayoutManager;private void initAdapter() {linearLayoutManager = new LinearLayoutManager(this);rv.setLayoutManager(linearLayoutManager);adapter = new CommonAdapter<Object>(mList, new CommonAdapter.OnMoreBindDataListener<Object>() {@Overridepublic int getItemType(int position) {if(mList.get(position) instanceof UserBean){return 0;}else{return 1;}}@Overridepublic void onBindViewHolder(Object model, CommonViewHolder viewHolder, int type, int position) {if(model instanceof UserBean){UserBean bean = (UserBean)model;viewHolder.setText(R.id.name_tv,bean.getName());}else{TitleBean bean = (TitleBean)model;viewHolder.setText(R.id.title_tv,bean.getName());}}@Overridepublic int getLayoutId(int type) {if(type == 0){return R.layout.item_name;}else{return R.layout.item_title;}}});rv.setAdapter(adapter);loadData();}private void loadData(){List<UserBean> list = new ArrayList<>();list.add(new UserBean("李鑫灏"));list.add(new UserBean("薛佛世"));list.add(new UserBean("蔡壮保"));list.add(new UserBean("钱勤堃"));list.add(new UserBean("潘恩依"));list.add(new UserBean("陈国柏"));list.add(new UserBean("陈国柏"));list.add(new UserBean("魏皑虎"));list.add(new UserBean("周卓浩"));list.add(new UserBean("汤辟邦"));list.add(new UserBean("张顺谷"));list.add(new UserBean("张悌斯"));list.add(new UserBean("张灶冲"));list.add(new UserBean("易江维"));list.add(new UserBean("萧百徽"));list.add(new UserBean("田稻善"));list.add(new UserBean("戚渊苏"));list.add(new UserBean("郭磊留"));list.add(new UserBean("啊平"));filledData(list);}/*** 填充数据** @return*/private void filledData(List<UserBean> mSortList) {mList.clear();scroolToMap.clear();for (int i = 0; i < mSortList.size(); i++) {UserBean sortModel = mSortList.get(i);if (!StringUtil.isNotEmpty(mSortList.get(i).getName())) {mSortList.get(i).setName("未知");}String pinyin = characterParser.getSelling(mSortList.get(i).getName());String sortString = pinyin.substring(0, 1).toUpperCase();if (sortString.matches("[A-Z]")) {sortModel.setSortLetters(sortString.toUpperCase());} else {sortModel.setSortLetters("#");}mSortList.set(i, sortModel);}Collections.sort(mSortList, pinyinComparator);for (int i = 0; i < mSortList.size(); i++) {UserBean bean = mSortList.get(i);if (!scroolToMap.containsKey(bean.getSortLetters())) {scroolToMap.put(bean.getSortLetters(), mList.size());mList.add(new TitleBean(bean.getSortLetters()));}mList.add(bean);}adapter.notifyDataSetChanged();}}

CommonAdapter

package com.example.maillist.adapter;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import androidx.recyclerview.widget.RecyclerView;import java.util.List;/*** created by yang on 2022/5/23 15:12*/
public class CommonAdapter<T> extends RecyclerView.Adapter<CommonViewHolder> {private final List<T> mList;private OnBindDataListener<T> onBindDataListener;private OnMoreBindDataListener<T> onMoreBindDataListener;// 单类型public CommonAdapter(List<T> mList, OnBindDataListener<T> onBindDataListener) {this.mList = mList;this.onBindDataListener = onBindDataListener;}// 多类型public CommonAdapter(List<T> mList, OnMoreBindDataListener<T> onMoreBindDataListener) {this.mList = mList;this.onBindDataListener = onMoreBindDataListener;this.onMoreBindDataListener = onMoreBindDataListener;}//绑定数据public interface OnBindDataListener<T> {void onBindViewHolder(T model, CommonViewHolder viewHolder, int type, int position);int getLayoutId(int type);}//绑定多类型的数据public interface OnMoreBindDataListener<T> extends OnBindDataListener<T> {int getItemType(int position);}@Overridepublic int getItemViewType(int position) {if (onMoreBindDataListener != null) {return onMoreBindDataListener.getItemType(position);}return 0;}@Overridepublic CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {int layoutId = onBindDataListener.getLayoutId(viewType);View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);return CommonViewHolder.getCommonViewHolder(parent.getContext(), view);}@Overridepublic void onBindViewHolder(CommonViewHolder holder, int position) {onBindDataListener.onBindViewHolder(mList.get(position), holder, getItemViewType(position), position);}@Overridepublic int getItemCount() {return mList == null ? 0 : mList.size();}// 插入一项数据public void insert(T item, int position) {mList.add(position, item);notifyItemInserted(position);}// 删除一项数据public void remove(int position) {mList.remove(position);notifyItemRemoved(position);}
}

CommonViewHolder

package com.example.maillist.adapter;import android.content.Context;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;import androidx.recyclerview.widget.RecyclerView;/*** created by yang on 2022/5/23 15:11*/
public class CommonViewHolder extends RecyclerView.ViewHolder {// 子View的集合private SparseArray<View> mViews;private Context context;public CommonViewHolder(Context context, View itemView) {super(itemView);this.context = context;mViews = new SparseArray<>();}public static CommonViewHolder getCommonViewHolder(Context context, View itemView) {return new CommonViewHolder(context, itemView);}/*** 提供给外部访问 View 的方法** @param viewId id* @param <T>    泛型* @return*/public <T extends View> T getView(int viewId) {View view = mViews.get(viewId);if (view == null) {view = itemView.findViewById(viewId);mViews.put(viewId, view);}return (T) view;}/*** 设置文本** @param viewId id* @param text   文本* @return this*/public CommonViewHolder setText(int viewId, String text) {TextView tv = getView(viewId);tv.setText(text);return this;}/*** 设置图片** @param viewId id* @param resId  图片id* @return this*/public CommonViewHolder setImageResource(int viewId, int resId) {ImageView iv = getView(viewId);iv.setImageResource(resId);return this;}
}

TitleBean

package com.example.maillist.bean;import java.io.Serializable;/*** created by yang on 2022/8/3 15:08*/
public class TitleBean implements Serializable {private String name;public TitleBean() {}public TitleBean(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

UserBean

package com.example.maillist.bean;import java.io.Serializable;/*** created by yang on 2022/8/3 15:08*/
public class UserBean implements Serializable {private String name;private String sortLetters;public UserBean() {}public UserBean(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSortLetters() {return sortLetters;}public void setSortLetters(String sortLetters) {this.sortLetters = sortLetters;}
}

CharacterParser


package com.example.maillist.utils;/*** 中文转拼音转换类* @author J**/
public class CharacterParser {private static int[] pyvalue = new int[] {-20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032,-20026, -20002, -19990, -19986, -19982, -19976, -19805, -19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741, -19739, -19728,-19725, -19715, -19540, -19531, -19525, -19515, -19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275, -19270, -19263, -19261,-19249, -19243, -19242, -19238, -19235, -19227, -19224, -19218, -19212, -19038, -19023, -19018, -19006, -19003, -18996, -18977, -18961,-18952, -18783, -18774, -18773, -18763, -18756, -18741, -18735, -18731, -18722, -18710, -18697, -18696, -18526, -18518, -18501, -18490,-18478, -18463, -18448, -18447, -18446, -18239, -18237, -18231, -18220, -18211, -18201, -18184, -18183, -18181, -18012, -17997, -17988,-17970, -17964, -17961, -17950, -17947, -17931, -17928, -17922, -17759, -17752, -17733, -17730, -17721, -17703, -17701, -17697, -17692,-17683, -17676, -17496, -17487, -17482, -17468, -17454, -17433, -17427, -17417, -17202, -17185, -16983, -16970, -16942, -16915, -16733,-16708, -16706, -16689, -16664, -16657, -16647, -16474, -16470, -16465, -16459, -16452, -16448, -16433, -16429, -16427, -16423, -16419,-16412, -16407, -16403, -16401, -16393, -16220, -16216, -16212, -16205, -16202, -16187, -16180, -16171, -16169, -16158, -16155, -15959,-15958, -15944, -15933, -15920, -15915, -15903, -15889, -15878, -15707, -15701, -15681, -15667, -15661, -15659, -15652, -15640, -15631,-15625, -15454, -15448, -15436, -15435, -15419, -15416, -15408, -15394, -15385, -15377, -15375, -15369, -15363, -15362, -15183, -15180,-15165, -15158, -15153, -15150, -15149, -15144, -15143, -15141, -15140, -15139, -15128, -15121, -15119, -15117, -15110, -15109, -14941,-14937, -14933, -14930, -14929, -14928, -14926, -14922, -14921, -14914, -14908, -14902, -14894, -14889, -14882, -14873, -14871, -14857,-14678, -14674, -14670, -14668, -14663, -14654, -14645, -14630, -14594, -14429, -14407, -14399, -14384, -14379, -14368, -14355, -14353,-14345, -14170, -14159, -14151, -14149, -14145, -14140, -14137, -14135, -14125, -14123, -14122, -14112, -14109, -14099, -14097, -14094,-14092, -14090, -14087, -14083, -13917, -13914, -13910, -13907, -13906, -13905, -13896, -13894, -13878, -13870, -13859, -13847, -13831,-13658, -13611, -13601, -13406, -13404, -13400, -13398, -13395, -13391, -13387, -13383, -13367, -13359, -13356, -13343, -13340, -13329,-13326, -13318, -13147, -13138, -13120, -13107, -13096, -13095, -13091, -13076, -13068, -13063, -13060, -12888, -12875, -12871, -12860,-12858, -12852, -12849, -12838, -12831, -12829, -12812, -12802, -12607, -12597, -12594, -12585, -12556, -12359, -12346, -12320, -12300,-12120, -12099, -12089, -12074, -12067, -12058, -12039, -11867, -11861, -11847, -11831, -11798, -11781, -11604, -11589, -11536, -11358,-11340, -11339, -11324, -11303, -11097, -11077, -11067, -11055, -11052, -11045, -11041, -11038, -11024, -11020, -11019, -11018, -11014,-10838, -10832, -10815, -10800, -10790, -10780, -10764, -10587, -10544, -10533, -10519, -10331, -10329, -10328, -10322, -10315, -10309,-10307, -10296, -10281, -10274, -10270, -10262, -10260, -10256, -10254};public static String[] pystr = new String[] {"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian","biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "ceng", "cha", "chai", "chan", "chang", "chao", "che","chen", "cheng", "chi", "chong", "chou", "chu", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan","cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du","duan", "dui", "dun", "duo", "e", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang","gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang","hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian","jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken","keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng","li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "lv", "luan", "lue", "lun", "luo", "ma", "mai","man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai","nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nu", "nv", "nuan","nue", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pu","qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re","ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha","shai", "shan", "shang", "shao", "she", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun","shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao","tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi","xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi","yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha","zhai", "zhan", "zhang", "zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui","zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"};private StringBuilder buffer;private String resource;private static CharacterParser characterParser = new CharacterParser();public static CharacterParser getInstance() {return characterParser;}public String getResource() {return resource;}public void setResource(String resource) {this.resource = resource;}private int getChsAscii(String chs) {int asc = 0;try {byte[] bytes = chs.getBytes("gb2312");if (bytes == null || bytes.length > 2 || bytes.length <= 0) {throw new RuntimeException("illegal resource string");}if (bytes.length == 1) {asc = bytes[0];}if (bytes.length == 2) {int hightByte = 256 + bytes[0];int lowByte = 256 + bytes[1];asc = (256 * hightByte + lowByte) - 256 * 256;}} catch (Exception e) {System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" + e);}return asc;}public String convert(String str) {String result = null;int ascii = getChsAscii(str);if (ascii > 0 && ascii < 160) {result = String.valueOf((char) ascii);} else {for (int i = (pyvalue.length - 1); i >= 0; i--) {if (pyvalue[i] <= ascii) {result = pystr[i];break;}}}return result;}public String getSelling(String chs) {String key, value;buffer = new StringBuilder();for (int i = 0; i < chs.length(); i++) {key = chs.substring(i, i + 1);if (key.getBytes().length >= 2) {value = (String) convert(key);if (value == null) {value = "unknown";}} else {value = key;}buffer.append(value);}return buffer.toString();}public String getSpelling() {return this.getSelling(this.getResource());}}

PinyinComparator

package com.example.maillist.utils;import com.example.maillist.bean.UserBean;import java.util.Comparator;public class PinyinComparator implements Comparator<UserBean> {public int compare(UserBean o1, UserBean o2) {if (o1.getSortLetters().equals("@") || o2.getSortLetters().equals("#")) {return -1;} else if (o1.getSortLetters().equals("#")|| o2.getSortLetters().equals("@")) {return 1;} else {return o1.getSortLetters().compareTo(o2.getSortLetters());}}}

StringUtil

package com.example.maillist.utils;/*** Created by yangjianli on 2017/8/29.*/public class StringUtil {public static boolean isNotEmpty(String str) {return str != null && str.trim().length() > 0;}/*** 判断是否为空** @param str* @return*/public static boolean isEmpty(String str) {return (str == null || str.trim().length() == 0);}}

SideBar

package com.example.maillist.widget;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;import com.example.maillist.R;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 选择旁边的字母列表**/
public class SideBar extends View {// 触摸事件private OnTouchingLetterChangedListener onTouchingLetterChangedListener;// 26个字母/*public static String[] letters = { "HOT","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"};*/@SuppressWarnings("unchecked")public static ArrayList<String> letters = new ArrayList<String>();public static List<String> allLetters = Arrays.asList(/*"定位","热门",*/"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;public void setLetters(List<String> list) {letters.clear();letters.addAll(list);this.invalidate();}public void setTextView(TextView mTextDialog) {this.mTextDialog = mTextDialog;}public SideBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);letters.addAll(allLetters);}public SideBar(Context context, AttributeSet attrs) {super(context, attrs);letters.addAll(allLetters);}public SideBar(Context context) {super(context);letters.addAll(allLetters);}/*** 重写这个方法*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 获取焦点改变背景颜色.int height = getHeight();// 获取对应高度int width = getWidth(); // 获取对应宽度int singleHeight = height / letters.size();// 获取每一个字母的高度for (int i = 0; i < letters.size(); i++) {paint.setColor(Color.rgb(174, 174, 174));// paint.setColor(Color.WHITE);
//          paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setAntiAlias(true);paint.setTextSize(getResources().getDimension(R.dimen.text_mll));// 选中的状态if (i == choose) {paint.setColor(Color.parseColor("#AEAEAE"));paint.setFakeBoldText(false);}// x坐标等于中间-字符串宽度的一半.float xPos = width / 2 - paint.measureText(letters.get(i)) / 2;float yPos = singleHeight * i + singleHeight;canvas.drawText(letters.get(i), xPos, yPos, paint);paint.reset();// 重置画笔}}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {final int action = event.getAction();final float y = event.getY();// 点击y坐标final int oldChoose = choose;final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;final int c = (int) (y / getHeight() * letters.size());// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.switch (action) {case MotionEvent.ACTION_UP:setBackgroundDrawable(new ColorDrawable(0x00000000));choose = -1;//invalidate();if (mTextDialog != null) {mTextDialog.setVisibility(View.INVISIBLE);}break;default:setBackgroundResource(R.color.white);if (oldChoose != c) {if (c >= 0 && c < letters.size()) {if (listener != null) {listener.onTouchingLetterChanged(letters.get(c));}if (mTextDialog != null) {mTextDialog.setText(letters.get(c));mTextDialog.setVisibility(View.VISIBLE);}choose = c;invalidate();}}break;}return true;}/*** 向外公开的方法** @param onTouchingLetterChangedListener*/public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;}/*** 接口** @author coder**/public interface OnTouchingLetterChangedListener {public void onTouchingLetterChanged(String s);}}

界面样式

activity_main.xml

<?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"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv"android:layout_width="match_parent"android:layout_height="match_parent"/><com.example.maillist.widget.SideBarandroid:id="@+id/sidrbar"android:layout_width="30dp"android:layout_marginTop="20dp"android:layout_marginBottom="20dp"android:layout_height="match_parent"android:layout_alignParentRight="true"/></RelativeLayout></LinearLayout>

item_name.xml

<?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="40dp"android:gravity="center_vertical"android:orientation="vertical"><TextViewandroid:id="@+id/name_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="14sp"android:textColor="#333"android:text=""android:layout_marginLeft="20dp"/></LinearLayout>

item_title.xml

<?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="40dp"android:gravity="center_vertical"android:background="#eeeeee"android:orientation="vertical"><TextViewandroid:id="@+id/title_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="14sp"android:textColor="#333"android:text=""android:layout_marginLeft="15dp"/></LinearLayout>

项目下载链接

demo下载地址

android通讯录demo相关推荐

  1. Jquery Mobile设计Android通讯录第二章

    本文是jQuery Mobile设计Android通讯录系统教程的第二篇,在上一篇教程中(http://publish.itpub.net/a2011/0517/1191/000001191561.s ...

  2. Android通讯录模糊匹配搜索实现 号码 首字母 简拼 全拼

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  3. Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  4. Android通讯录模糊匹配搜索实现(号码 首字母 简拼 全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  5. Android API Demo程序框架

    前言 android API Demo程序主要演示了Android常见API的使用方法, 本文将该程序的框架提取出来, 以作为自己研究和学习Android编程的一个示例收集框架,即将所有自己研究过的例 ...

  6. android通讯录管理(获取联系人,通话记录,短信消息),Android通讯录管理(获取联系人、通话记录、短信消息)(二)...

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 界面布局: /Contact_Demo/res/layout ...

  7. Android 系统(254)---Android libphonenumber Demo 手机号码归属地

    Android libphonenumber Demo 手机号码归属地 libphonenumber 是google 开源的库,提供手机号码格式化,来电归属地,运营商等多种功能十分强大,现在做个简单的 ...

  8. android通讯录备份恢复代码逻辑

    android通讯录备份恢复 新增和修改 目前用的是新增,云端判断返回的手机号是否为空 /*** 向手机中录入联系人信息** @param contactListBean 要录入的联系人信息*/pub ...

  9. android demo示例代码,Android Service demo例子使用详解(示例代码)

    Android Service demo例子使用详解\ 概述 Service 是 Android 的四大组件之一,它主要的作用是后台执行操作,Activity 属于带有 UI 界面跟用户进行交互,而 ...

最新文章

  1. 步步为营UML建模系列二、部署图(Deployment Diagram)
  2. Git与Ftp协同工作
  3. 成功解决AttributeError: module ‘tensorflow‘ has no attribute ‘contrib‘
  4. MySQL - 日常操作二 备份还原
  5. IDEA远程调试服务器代码
  6. 属性 元素的内容 创建,插入和删除节点 虚拟节点
  7. autocad型源代码_C# 实现预览dwg文件完整源代码(无需autocad环境)
  8. 在线多空行只保留一个工具
  9. Node.js 切近实战(七) 之Excel在线(文件文件组)
  10. Vue Element校验validate
  11. linux系统交叉编译如何打包,构建ARM Linux交叉编译器
  12. 跳台阶问题详解---动态规划
  13. android壁纸 4k,4k动态壁纸下载-4k动态壁纸 安卓版v1.0.4-PC6安卓网
  14. Qt调用工业相机之映美精相机
  15. 其实,以前都没发现------网易公开课
  16. 一阶微分方程的物理意义_薛定谔方程的物理意义
  17. python tkinter学习6 scale滑条
  18. SCI投稿:MDPI旗下期刊Mathematics投稿经历
  19. a boo peek_|音译|171120*歌词ΓRed Velvet - Peek-A-Boo
  20. for循环--下标越界导致死循环原因

热门文章

  1. GO与其它数据库见的id转换
  2. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...
  3. 专访王颖泽:国产数据库开源之路如何可控?
  4. jetson emmc版本刷机。
  5. 《自学是门手艺活》读后感
  6. [COGS 2583]南极科考旅行
  7. 基于MPS先进CFD软件Prometech.ParticleWorks.6.0.0.161003
  8. 工业品行业商城系统解决方案
  9. 每周资讯 | 三星成为加拿大Telus5G设备供应商、高通发布骁龙690处理器、诺基亚与博通合作开发5G芯片……...
  10. 数学建模:插值与拟合—插值问题的python求解