2

I am working on an application in which i need to fetch all the contacts from the contact book and display. i want the user to select some contacts and add them in a group which is saved in db.

i have created a custom list view- contactitem.xml-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">


 <TextView

    android:id="@+id/contactname"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_weight="1"
    android:layout_marginLeft="20dp"
    android:ellipsize="end"        
   android:singleLine="true"
    android:clickable="true"/>

 <TextView
    android:id="@+id/contactnum"
    android:layout_width="wrap_content"
     android:textColor="@color/White"
     android:clickable="true"
     android:layout_gravity="center_vertical"
     android:layout_height="wrap_content"/>

  <Button
    android:id="@+id/add"
    android:layout_width="wrap_content"
    android:layout_height="35dp"
    android:text="@string/add_contacts"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:focusable="false"
    android:focusableInTouchMode="false"/>

</LinearLayout>

i have a SelectContact class for fetching contacts from Contact book-

   public class SelectContacts extends Activity implements OnClickListener{

    private String groupName;
    private Button back;
    private Button home;
    private List<Contact> list = new ArrayList<Contact>();

    private ListView contactList;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.selectcontacts);

            Bundle bundle = getIntent().getExtras();
            groupName=bundle.getString("groupName");

            back=(Button)findViewById(R.id.back_button);
            back.setOnClickListener(this);

            home=(Button)findViewById(R.id.home_button);
            home.setOnClickListener(this);

            contactList=(ListView)findViewById(R.id.contactsListView);

            ContentResolver cr = getContentResolver();



            Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

            cur.moveToFirst();

            if (cur.getCount() > 0) {

                do{

                    String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));

                    String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {

                    String[] fields={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};    

                    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, fields, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);

                    pCur.moveToFirst();

                     do { 

                        String number=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                        Contact c=new Contact(name,number);

                        list.add(c);

                        }while (pCur.moveToNext());

                        pCur.close();
                    }               



                   }while (cur.moveToNext());

                ContactAdapter contactAdapter=new ContactAdapter(this, R.layout.contactitem, list, contactList,groupName);



                contactList.setAdapter(contactAdapter);


            }


        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            Intent intent= new Intent();

            if(v==back){

                Bundle bundle = new Bundle();
                bundle.putString("groupName", groupName);
                intent.putExtras(bundle);

                intent.setClass(SelectContacts.this, GroupDetails.class);
                startActivity(intent);

            }
            if(v==home){
                intent.setClass(SelectContacts.this, Welcome.class);
                startActivity(intent);

            }

        }
}

and implemented a custom adapter- ContactAdapter-`

public class ContactAdapter extends ArrayAdapter<HashMap<String, Contact>>{

private ArrayList<HashMap<String, Contact>> items;

private LayoutInflater mInflater ; 

public ContactAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Contact>> items) {

        super(context, textViewResourceId, items);

        this.items = items;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

            mInflater = LayoutInflater.from(getContext());

            ViewHolder holder;

       if(convertView==null){

            convertView = mInflater.inflate(R.layout.contactitem, parent, false);

            holder = new ViewHolder();

            holder.name = (TextView) convertView.findViewById(R.id.contactname);

            holder.number = (TextView) convertView.findViewById(R.id.contactnum);

            holder.add=(Button)convertView.findViewById(R.id.add);

            convertView.setTag(holder);

        }

       else{

            holder=(ViewHolder)convertView.getTag();

        }

       String name=items.get(position).get(""+position).getContactName();

       String number=items.get(position).get(""+position).getContactNum();

       holder.name.setText(name);

       holder.number.setText(number);

        return convertView;
}



static class ViewHolder{

    TextView name;

    TextView number;

    Button add;

}

}

here Contact is a simple POJO-



public class Contact {
    private String contactName;
    private String contactNum;

    public String getContactName() {
        return contactName;
    }
    public void setContactName(String contactName) {
        this.contactName = contactName;
    }

    public String getContactNum() {
        return contactNum;
    }
    public void setContactNum(String contactNum) {
        this.contactNum = contactName;
    }

}

i am a newbie in android..

The above code works quiet fine on emulater and fetch contact name and numbers to display in list. but when i test this code on phone which have a Gmail account syncronized, it got crashed with following error..

CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

I don't have any idea why this is happening. Please give some suggestions...

2 Answers 2

1

It seems you forgot to call cur.moveToFirst(); after fetching the Contact Cursor. After this line,

Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

You are also missing the same thing here, after this - pCur.moveToFirst();

Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
Sign up to request clarification or add additional context in comments.

2 Comments

Made the change but Still getting the same log entry... :(
You are missing the same thing in another cursor also, check my edited answer.
1

Use the following functions:

  • cur.moveToFirst();
  • pCur.moveToFirst();

1 Comment

It worked.. thank you sir.. But still it couldnt display contacts in activity.. May be i am having some problem with my adapter...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.