Android实现手机联系人分栏效果

Penny ·
更新时间:2024-09-20
· 963 次阅读

本文实例为大家分享了Android实现手机联系人分栏效果的具体代码,供大家参考,具体内容如下

小编在项目时期遇见了制作手机联系人分栏效果,查询了很多资料,现在总结如下:

添加的代码并不多,用ListView写好数据以后,只需在Adapter里添加一个方法,并且在getView()方法里添加几行代码即可。不过小编现在介绍的方法,只适合做简单项目,大型项目还没研究该代码是否有缺陷,欢迎各位大神批评指教。

给大家看一下,小编做的代码效果图:

adapter具体代码如下:

public class ContactAdapter extends BaseAdapter<ContactBeen>{       private List<ContactBeen> contactBeens;       private Context context;       public ContactAdapter(Context context, List<ContactBeen> datas) {         super(context, datas);         this.context = context;         contactBeens = datas;     }   @Override     public View getView(int position, View convertView, ViewGroup parent) {         ViewHodler viewHodler = null;         if(convertView == null){             convertView = inflater.inflate(R.layout.contact_item,parent,false);             viewHodler = new ViewHodler(convertView);             convertView.setTag(viewHodler);         }else {             viewHodler = (ViewHodler)convertView.getTag();         }         viewHodler.name.setText(contactBeens.get(position).getName());         viewHodler.number.setText(contactBeens.get(position).getNumber());         viewHodler.image.setmBitmap(Analysis(contactBeens.get(position).getImage()));         // 获得当前联系人名字的首字母。 其中:getAlpha()方法是自己写的一个方法(具体介绍如下), contactBeens.get(position).getAlpha()中的getAlpha()是我定义的实体类的get方法,值为当前联系人的名字的拼音。         String currentStr = getAlpha(contactBeens.get(position).getAlpha());         // 获得上一个联系人名字的首字母         String previewStr = (position - 1) >= 0 ? getAlpha(contactBeens.get(position - 1).getAlpha()) : " ";         /**          * 判断显示#、A-Z的TextView隐藏与可见          */         if (!previewStr.equals(currentStr)) {             viewHodler.alpha.setVisibility(View.VISIBLE);             viewHodler.alpha.setText(currentStr);         } else {         //当前联系人与上一个联系人首字母相同时,执行下面代码,隐藏alpha(这是我定义的textView)。             viewHodler.alpha.setVisibility(View.GONE);         }         return convertView;     }     public class ViewHodler{         private ContomImage image;         private TextView name;         private TextView number;         private TextView alpha;         public ViewHodler(View view) {             image = (ContomImage) view.findViewById(R.id.contact_contomImage);             name = (TextView) view.findViewById(R.id.contact_name);             number = (TextView) view.findViewById(R.id.contact_number);             alpha = (TextView) view.findViewById(R.id.alpha);         }     }      //通过联系人的名字str ,返回联系人名字的首字母大写     @NonNull     private String getAlpha(String str) {         if (str == null) {             return "#";         }         if (str.trim().length() == 0) {             return "#";         }         char c = str.trim().substring(0, 1).charAt(0);         //判断首字母是否是英文字母         if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {             return (c + "").toUpperCase(); // 大写输出         } else {             return "#";         }     } }

适配器代码解释如下:

List contactBeens 数据,是从适配器的构造方法传过来的。数据是根据Cursor一条一条的从虚拟机的联系人数据库读出来的。
在适配器代码中有多处出现getAlpha(),这个getAlpha()有两个含义:

getAlpha(contactBeens.get(position).getAlpha()); 解释: 从左边开始,第一次出现的getAlpha()是代码中最后定义的方法,是自己写的一个方法。 第二次出现的getAlpha()是实体类里的get方法,

现在来看一下,ContactBeen这个实体类里的成员变量:

public class ContactBeen {     private String name;     private String number;     private Uri image;     //该变量存储从虚拟机里读出来的每个联系人的名字的拼音     private String alpha;     ....  //剩下的为上述变量的get 和  set方法 以及该类的构造方法, 这里就不一一写出来了。 }

到这里为止,已经实现了小编今天要说的手机联系人分栏效果。如果有任何问题,给我留言,看见了一一答复,欢迎各位大神批评指教。

在这里,小编再给大家展示 : 如何从虚拟机中获取手机联系人的方法:

ContentResolver resolver1 = context.getContentResolver(); Cursor cursor1  = resolver1.query(uri,null,null,null,"sort_key");   if(cursor1 != null && cursor1.moveToFirst()){        int indexName = cursor1.getColumnIndex(Phone.DISPLAY_NAME);        int indexNumber = cursor1.getColumnIndex(Phone.NUMBER);        int indexId = cursor1.getColumnIndex(Phone.CONTACT_ID);        int indexPhoneId = cursor1.getColumnIndex(Phone.PHOTO_ID);        int indexAlpha =  cursor1.getColumnIndex("sort_key");//"sort_key"保存的是联系人名字的拼音字母                     Uri uri1 = null;                     do {                         String name = cursor1.getString(indexName);                         String number = cursor1.getString(indexNumber);                         Long contactId = cursor1.getLong(indexId);                         Long phoneId = cursor1.getLong(indexPhoneId);                         String alpha = cursor1.getString(indexAlpha);                         if(phoneId > 0){                             uri1 = ContentUris.withAppendedId(Contacts.CONTENT_URI,contactId);                         }else {                             uri1 = null ;                         }                         ContactBeen been = new ContactBeen(name,number,uri1,alpha);                         Log.d(TAG, "name : "+ name + " number : " + number + " uri1 : " + uri1 +  "alpha :" + alpha );         }while (cursor1.moveToNext());    cursor1.close(); }



联系 手机 Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号