Last updated on January 9th, 2020 at 12:35 pm
In this post i explain you how we get contact list and show in custom ListView android. Most app show your mobile contacts in there customize view in there app eg. WhatsApp etc. This is very simple and easy to implement in your project.
Code:
Step 1. Create new android project in your android studio or eclipse.
Step 2. First we need to app permission in your manifest file to read contact list. add the following line to read contact before Application tag
<uses-permission android:name="android.permission.READ_CONTACTS" />
Step 3. Now open your activity_main.xm file inside layout folder and add ListView in it and i also add search functionality in it so i also add SearchView as shown below code.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#5b74a8" android:id="@+id/frag"> <TextView android:id="@+id/srchHint" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Search.." android:textSize="16dp" android:textColor="#000" android:layout_gravity="center" /> <SearchView android:background="#5b74a8" android:padding="8dp" android:id="@+id/searchView" android:drawableLeft="@android:drawable/ic_menu_search" android:layout_width="wrap_content" android:singleLine="true" android:layout_gravity="right" android:layout_height="wrap_content"></SearchView> </FrameLayout> <ListView android:layout_below="@+id/frag" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/contacts_list"></ListView> </RelativeLayout>
Step 4. Now before start java coding i also create a view which i inflate in listview or a view in which we load or contact list as shown below.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_margin="5dp" android:weightSum="3"> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:id="@+id/pic" android:src="@drawable/image" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="2.6" android:layout_margin="5dp" android:paddingLeft="10dp" android:layout_gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/name" android:text="User name" android:textSize="18dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/no" android:layout_marginTop="10dp" android:text="Phone no." android:textSize="18dp" /> </LinearLayout> <LinearLayout android:layout_weight="0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center" android:gravity="center" android:visibility="gone" android:orientation="horizontal"> <CheckBox android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/check" /> </LinearLayout> </LinearLayout> </LinearLayout>
Above view is very simple it contain a image view and contact person name and its contact number. I also add check box but i did not use in this but if you need it change its visibility.
Step 5. Now first i create a getter setter class in which i save my contact list info to use it further.
package com.trinitygetcontact.getset; import android.graphics.Bitmap; /** * Created by Trinity Tuts on 10-01-2015. */ public class SelectUser { String name; public Bitmap getThumb() { return thumb; } public void setThumb(Bitmap thumb) { this.thumb = thumb; } Bitmap thumb; public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } String phone; public Boolean getCheckedBox() { return checkedBox; } public void setCheckedBox(Boolean checkedBox) { this.checkedBox = checkedBox; } Boolean checkedBox = false; public String getName() { return name; } public void setName(String name) { this.name = name; } String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
Step 6. Now i create custom adapter to inflate data in listview
package com.trinitygetcontact.adapter; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.trinitygetcontact.R; import com.trinitygetcontact.getset.SelectUser; import com.trinitygetcontact.utils.RoundImage; import java.util.ArrayList; import java.util.List; import java.util.Locale; /** * Created by Trinity Tuts on 10-01-2015. */ public class SelectUserAdapter extends BaseAdapter { public List<SelectUser> _data; private ArrayList<SelectUser> arraylist; Context _c; ViewHolder v; RoundImage roundedImage; public SelectUserAdapter(List<SelectUser> selectUsers, Context context) { _data = selectUsers; _c = context; this.arraylist = new ArrayList<SelectUser>(); this.arraylist.addAll(_data); } @Override public int getCount() { return _data.size(); } @Override public Object getItem(int i) { return _data.get(i); } @Override public long getItemId(int i) { return i; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public View getView(int i, View convertView, ViewGroup viewGroup) { View view = convertView; if (view == null) { LayoutInflater li = (LayoutInflater) _c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = li.inflate(R.layout.contact_info, null); Log.e("Inside", "here--------------------------- In view1"); } else { view = convertView; Log.e("Inside", "here--------------------------- In view2"); } v = new ViewHolder(); v.title = (TextView) view.findViewById(R.id.name); v.check = (CheckBox) view.findViewById(R.id.check); v.phone = (TextView) view.findViewById(R.id.no); v.imageView = (ImageView) view.findViewById(R.id.pic); final SelectUser data = (SelectUser) _data.get(i); v.title.setText(data.getName()); v.check.setChecked(data.getCheckedBox()); v.phone.setText(data.getPhone()); // Set image if exists try { if (data.getThumb() != null) { v.imageView.setImageBitmap(data.getThumb()); } else { v.imageView.setImageResource(R.drawable.image); } // Seting round image Bitmap bm = BitmapFactory.decodeResource(view.getResources(), R.drawable.image); // Load default image roundedImage = new RoundImage(bm); v.imageView.setImageDrawable(roundedImage); } catch (OutOfMemoryError e) { // Add default picture v.imageView.setImageDrawable(this._c.getDrawable(R.drawable.image)); e.printStackTrace(); } Log.e("Image Thumb", "--------------" + data.getThumb()); /*// Set check box listener android v.check.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CheckBox checkBox = (CheckBox) view; if (checkBox.isChecked()) { data.setCheckedBox(true); } else { data.setCheckedBox(false); } } });*/ view.setTag(data); return view; } // Filter Class public void filter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); _data.clear(); if (charText.length() == 0) { _data.addAll(arraylist); } else { for (SelectUser wp : arraylist) { if (wp.getName().toLowerCase(Locale.getDefault()) .contains(charText)) { _data.add(wp); } } } notifyDataSetChanged(); } static class ViewHolder { ImageView imageView; TextView title, phone; CheckBox check; } }
If you want to use check box please remove comment from check box listener in above class.
Step 7. Now open your MainActivity.java class and call classes we create. In this i also use RoundImage class which is use to round your image.
package com.trinitygetcontact; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SearchView; import android.widget.Toast; import com.trinitygetcontact.adapter.SelectUserAdapter; import com.trinitygetcontact.getset.SelectUser; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { // ArrayList ArrayList<SelectUser> selectUsers; List<SelectUser> temp; // Contact List ListView listView; // Cursor to load contacts list Cursor phones, email; // Pop up ContentResolver resolver; SearchView search; SelectUserAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); selectUsers = new ArrayList<SelectUser>(); resolver = this.getContentResolver(); listView = (ListView) findViewById(R.id.contacts_list); phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); LoadContact loadContact = new LoadContact(); loadContact.execute(); search = (SearchView) findViewById(R.id.searchView); //*** setOnQueryTextListener *** search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // TODO Auto-generated method stub return false; } @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub adapter.filter(newText); return false; } }); } // Load data on background class LoadContact extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... voids) { // Get Contact list from Phone if (phones != null) { Log.e("count", "" + phones.getCount()); if (phones.getCount() == 0) { Toast.makeText(MainActivity.this, "No contacts in your contact list.", Toast.LENGTH_LONG).show(); } while (phones.moveToNext()) { Bitmap bit_thumb = null; String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); String EmailAddr = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA2)); String image_thumb = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI)); try { if (image_thumb != null) { bit_thumb = MediaStore.Images.Media.getBitmap(resolver, Uri.parse(image_thumb)); } else { Log.e("No Image Thumb", "--------------"); } } catch (IOException e) { e.printStackTrace(); } SelectUser selectUser = new SelectUser(); selectUser.setThumb(bit_thumb); selectUser.setName(name); selectUser.setPhone(phoneNumber); selectUser.setEmail(id); selectUser.setCheckedBox(false); selectUsers.add(selectUser); } } else { Log.e("Cursor close 1", "----------------"); } //phones.close(); return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); adapter = new SelectUserAdapter(selectUsers, MainActivity.this); listView.setAdapter(adapter); // Select item on listclick listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Log.e("search", "here---------------- listener"); SelectUser data = selectUsers.get(i); } }); listView.setFastScrollEnabled(true); } } @Override protected void onStop() { super.onStop(); phones.close(); } }
Note in this i also use Async Class because if user have large contact list it will hang you application for some time so i load all contact in background.
Hope this code help in your project feel free to comment.
Happy coding 🙂 .