-1

am trying to populate my contact list in a custom list view but am facing this problem

activity_main.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" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<ListView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:id="@+id/listView"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true" />

listview_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="right"
    android:layout_marginTop="50dp"
    android:layout_marginLeft="20dp"
    android:paddingTop="30dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/name" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/num" />
</LinearLayout>

my main activity class

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView lv = (ListView) findViewById(R.id.listView);

    Uri uri = ContactsContract.Contacts.CONTENT_URI;
     String [] cols = {ContactsContract.Contacts._ID
             , ContactsContract.Contacts.DISPLAY_NAME
             , ContactsContract.Contacts.LOOKUP_KEY
             ,ContactsContract.Contacts.HAS_PHONE_NUMBER};

    String selections = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ? ";

    Cursor cursor = getContentResolver().query(uri,cols,selections,new String [] {"1"},null);

    Adapter adapter = new Adapter(MainActivity.this , cursor);
    lv.setAdapter(adapter);

}

Adapter class that extends CursorAdapter

class Adapter extends CursorAdapter{

    Context context;
    Cursor c;

    public Adapter(Context context , Cursor c ) {
        super(context, c, 0);
        this.context = context;
        this.c = c;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
        View v = getLayoutInflater().inflate(R.layout.listview_item, viewGroup, false);

        return v;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {


            TextView name = (TextView) findViewById(R.id.name);
            name.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
            TextView num = (TextView) findViewById(R.id.num);
            num.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));

        }
    }
}

here is the LogCat exception

03-26 20:56:55.450    1847-1847/com.examples.anabil.contentproviderex E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at com.examples.anabil.contentproviderex.MainActivity$Adapter.bindView(MainActivity.java:79)
        at android.widget.CursorAdapter.getView(CursorAdapter.java:250)
        at android.widget.AbsListView.obtainView(AbsListView.java:2177)
        at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
        at android.widget.ListView.onMeasure(ListView.java:1159)
        at android.view.View.measure(View.java:15848)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:477)
        at android.view.View.measure(View.java:15848)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at android.view.View.measure(View.java:15848)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
        at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453)
        at android.view.View.measure(View.java:15848)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at android.view.View.measure(View.java:15848)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
        at android.view.View.measure(View.java:15848)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
        at android.view.View.measure(View.java:15848)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
        at android.view.Choreographer.doCallbacks(Choreographer.java:562)
        at android.view.Choreographer.doFrame(Choreographer.java:532)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
  • Have you declared TextView items with ids `name` and `num` in XML? Also, try to change in `bindView()` method: `TextView name = (TextView) view.findViewById(R.id.name);` – VadymVL Mar 26 '15 at 21:28
  • sorry i forgot to copy the xml code but i recently did – Ahmed Nabil Mar 26 '15 at 21:35
  • Did you tried to change in `bindView()`method: `TextView name = (TextView) view.findViewById(R.id.name);` (And the same for second textView)? – VadymVL Mar 26 '15 at 21:38
  • yup ! it works , but why it gives me only number 1 in the num textview – Ahmed Nabil Mar 26 '15 at 21:42
  • Because you are querying it: `getContentResolver().query(uri,cols,selections,new String [] {"1"},null);` – VadymVL Mar 26 '15 at 21:44
  • so i want to make the num textview show all numberw can you explain to me how can i replace it with the correct parameter – Ahmed Nabil Mar 26 '15 at 21:48
  • You can find it [here](http://stackoverflow.com/questions/6587674/android-contacts-display-name-and-phone-numbers-in-single-database-query). – VadymVL Mar 27 '15 at 06:43

1 Answers1

0

VadymVL answer will fix your null pointer error.

Accessing the raw contact table (ContactsContract.Contacts) is slow. Try using ContactsContract.CommonDataKinds.Phone:

public Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String [] cols = {ContactsContract.CommonDataKinds.Phone.CONTACT_ID
         , ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
         , ContactsContract.CommonDataKinds.Phone.NUMBER}; 

String selections =  ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + " = '1'";

Cursor Cursor = contentResolver.query(uri, cols, selections, null, null);

In bindView:

@Override
public void bindView(View view, Context context, Cursor cursor) {

        TextView name = (TextView) view.findViewById(R.id.name);
        name.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
        TextView num = (TextView) view.findViewById(R.id.num);
        num.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
    }
}
itechevo
  • 191
  • 2
  • 5
  • thanks , but whats the different between Contacts class and CommonDataKinds class ? – Ahmed Nabil Mar 27 '15 at 13:06
  • Contacts - has raw contact details and doesn't contain data like phone number, email, nickname, etc. You need to query ContactsContract.Data for these details. It is simpler to use data kind like CommonDataKinds.Phone or CommanDataKinds.Email, to query just the specific data you want. [android](http://developer.android.com/reference/android/provider/ContactsContract.Data.html) – itechevo Mar 27 '15 at 19:55