0

I am trying to get all the contacts of the phone in a listview with checkboxes in order to select multiple contacts at a time. I have written some code which is creating the same number of rows as the number of contacts in my emulator. But the problem is the name and number of the contacts are not appearing as you can see in the image attached. Moreover when i click Show contacts button to show the selected contacts in Toast that too is not happening.

enter image description here

custcontactview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="5.0px"
android:paddingLeft="5.0px"
android:paddingTop="5.0px" >

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="false" />

<TextView
    android:id="@+id/cConName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/checkBox1"
    android:layout_marginLeft="15.0dip"
    android:layout_toRightOf="@+id/checkBox1"
    android:text="Small Text"
    android:textAppearance="?android:textAppearanceSmall" />

<TextView
    android:id="@+id/cConNum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/cConName"
    android:layout_marginLeft="15.0dip"
    android:layout_toRightOf="@id/checkBox1"
    android:text="Medium Text"
    android:textAppearance="?android:textAppearanceMedium" />

</RelativeLayout>

activity_contacts_picker.xml

<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" >

<Button
    android:id="@+id/btnShow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Show Selected" />

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/btnShow" >
</ListView>

</RelativeLayout>

ContactsPicker.java

public class ContactsPicker extends ListActivity {

protected Object mActionMode;
public int selectedItem = -1;
private Button btnShowContacts;
private ListView myListView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contacts_picker);
            myListView = getListView();
    btnShowContacts = (Button) findViewById(R.id.btnShow);
    btnShowContacts.setOnClickListener(new View.OnClickListener() {
        public void onClick (View v){
            Toast.makeText(getApplicationContext(), "Button Clicked", Toast.LENGTH_SHORT).show();
            String name = null;
            String number = null;
            long [] ids = myListView.getCheckedItemIds();
            for(long id : ids) {
                Cursor contact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id + "" }, null);
                while(contact.moveToNext()){
                    name = contact.getString(contact.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    number = contact.getString(contact.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }
                Toast.makeText(getApplicationContext(), "Name: " +name + "\n" + "Number: " + number , Toast.LENGTH_LONG).show();
            }
        }
    });
    ArrayList<Map<String, String>> list = buildData();
    String[] from = { "name", "purpose" };
    int[] to = { R.id.cConName, R.id.cConNum };
    SimpleAdapter adapter = new SimpleAdapter(this, list,R.layout.custcontactview, from, to);
    setListAdapter(adapter);
}

private ArrayList<Map<String, String>> buildData() {
    ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
    list.clear();
    Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null,null);
    while (people.moveToNext()) {
        String contactName = people.getString(people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        String contactId = people.getString(people.getColumnIndex(ContactsContract.Contacts._ID));
        String hasPhone = people.getString(people.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
        if ((Integer.parseInt(hasPhone) > 0)) {
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
            while (phones.moveToNext()) {
                String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                Map<String, String> NamePhoneType = new HashMap<String, String>();
                NamePhoneType.put("Name", contactName);
                NamePhoneType.put("Phone", phoneNumber);
                list.add(NamePhoneType);
            }
            phones.close();
        }
    }
    people.close();
    startManagingCursor(people);        
    return list;
  }
}
Tapan Desai
  • 848
  • 2
  • 14
  • 36

2 Answers2

0

But the problem is the name and number of the contacts are not appearing as you can see in the image attached

First of all, I guess you checked and see that you have real values in the ArrayList list in the buildData method. Second you use the key names "Name" and "Phone" when you add the values to the HashMap, but in the from String array that you use in the SimpleAdapter you use the values "name" and "purpose". In the from String array you need to have the same keys as you have in the HashMap.

Moreover when i click Show contacts button to show the selected contacts in Toast that too is not happening.

First, you can't use ListView's default mechanism for checked items when you have a custom row view. If you want to get the checked items you'll need to manage the state of the CheckBox from the row yourself. The getCheckedItemIds() method will not return something valid and the query will fail returning any valid results. Instead you should implement your own custom adapter and return the row's HashMap(which will contain the name and the phone) with SimpleAdapter.getItem method. This way you'll avoid the need to query the contacts again.

user
  • 86,916
  • 18
  • 197
  • 190
0

call notifyDataSetChanged(); You need to refresh the list..

hacker
  • 8,919
  • 12
  • 62
  • 108