Reputation: 69
I am trying to have name of contacts in one array and their types in another array,but can't get through with null pointer exception.here is my code.I have pointed out the line where I am getting null pointer exception.please help..thanks in advance.
package application.test;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts.Data;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
public final class TestActivity extends Activity {
String[] name;
String[] phoneType;
ListView lv;
ListViewAdapter lva;
public static final String TAG = "ContactManager";
@Override
public void onCreate(Bundle savedInstanceState)
{
Log.v(TAG, "Activity State: onCreate()");
super.onCreate(savedInstanceState);
LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
LinearLayout mainLayout=new LinearLayout(this);
mainLayout.setOrientation(LinearLayout.VERTICAL);
LayoutInflater layoutInflater = getLayoutInflater();
mainLayout.addView(layoutInflater.inflate(R.layout.main,null));
mainLayout.addView(layoutInflater.inflate(R.layout.extra,null));
this.addContentView(mainLayout, params);
lv = (ListView)findViewById(android.R.id.list);
lva = new ListViewAdapter(this,name,phoneType);
lv.setAdapter(lva);
testGetContacts();
}
private void testGetContacts() {
ContentResolver cr = getContentResolver();
String[] projection = new String[] { Data._ID,
ContactsContract.Contacts.DISPLAY_NAME, Phone.TYPE};
Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI,
projection, null, null, null);
if (cur != null && cur.moveToFirst()) {
try {
int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME);
int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE);
while (cur.moveToNext()) {
int i=1;
String id = cur.getString(indexID);
//HERE LIES NULL POINTER EXCEPTION name[i] = cur.getString(indexName);
//HERE TOO phoneType[i] = cur.getString(indexPhoneType);
i++;
System.out.println(id + "\n");
System.out.println(name + "\n");
System.out.println(phoneType + "\n");
}
} catch (SQLException sqle) {
//handling exception
} finally {
if (!cur.isClosed()) {
cur.close();
}
}
}
}
}
Upvotes: 0
Views: 1922
Reputation: 1741
Try this and tell me i it helped:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView)findViewById(R.id.listview);
testGetContacts();
ArrayAdapter<String> sa=new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,s);
lv.setAdapter(sa);
}//method
private void testGetContacts() {
ContentResolver cr = getContentResolver();
String[] projection = new String[] { Data._ID,
ContactsContract.Contacts.DISPLAY_NAME, Phone.TYPE};
Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI,
projection, null, null, null);
if (cur != null && cur.moveToFirst()) {
try {
int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME);
int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE);
name=new String[cur.getCount()];
phoneType=new String[cur.getCount()];
s=new String[cur.getCount()];
int i=1;
while (cur.moveToNext()) {
String id = cur.getString(indexID);
name[i] = cur.getString(indexName);
phoneType[i] = cur.getString(indexPhoneType);
String temp="id="+id+"-name="+name[i]+"-phoneType="+phoneType[i];
s[i-1]=temp;
i++;
}//while
ArrayAdapter<String> sa=new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,s);
lv.setAdapter(sa);
}catch(Exception e){
e.printStackTrace();
}//catch
}//if
}//method
Upvotes: 0
Reputation: 19250
You are getting null pointer because you are accessing wrong index.
try this:
s=new String[cur.getCount()];
int i=1;
while (cur.moveToNext()) {
String id = cur.getString(indexID);
name[i-1] = cur.getString(indexName);
phoneType[i-1] = cur.getString(indexPhoneType);
String temp="id="+id+"-name="+name[i-1]+"-phoneType="+phoneType[i-1];
s[i-1]=temp;
i++;
}
and also lv=(ListView)findViewById(R.id.listview);
instead of lv=(ListView)findViewById(android.R.id.list);
You should add a condition here:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
testGetContacts();
if(s.length()>0)
{
lv = (ListView)findViewById(R.id.listview);
ArrayAdapter<String> sa=new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,s);
lv.setAdapter(sa);
}
else
{
Toast.makeText(getApplicationContext(),"Nothing Found",Toast.LENGTH_SHORT).show();
}
Upvotes: 0
Reputation: 19250
Initialize String[]
name before using it.
You can do that like:
name=new String[cur.getCount()];
String s="";
while (cur.moveToNext()) {
int i=1;
String id = cur.getString(indexID);
name[i] = cur.getString(indexName);
phoneType[i] = cur.getString(indexPhoneType);
//System.out.println(id + "\n");
//System.out.println(name + "\n");
//System.out.println(phoneType + "\n");
s=s+"id="+id+" name="+name[i]+" phoneType="+phoneType[i]+"\n";
i++;
}
Toast.makeText(getApplicationContext(),i+" - "+s).show();
Edit :
Create an xml file in layout folder.
main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical" >
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listview"
android:cacheColorHint="#0000"
/>
</LinearLayout>
now in your TestActivity.class:
public final class TestActivity extends Activity {
String[] name;
String[] phoneType;
ListView lv;
String s[];
public static final String TAG = "ContactManager";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.id.main);
testGetContacts();
lv = (ListView)findViewById(R.id.listview);
ArrayAdapter<String> sa=new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1,s);
lv.setAdapter(sa);
}
private void testGetContacts() {
ContentResolver cr = getContentResolver();
String[] projection = new String[] { Data._ID,
ContactsContract.Contacts.DISPLAY_NAME, Phone.TYPE};
Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI,
projection, null, null, null);
if (cur != null && cur.moveToFirst()) {
try {
int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME);
int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE);
name=new String[cur.getCount()];
s=new String[cur.getCount()];
while (cur.moveToNext()) {
int i=1;
String id = cur.getString(indexID);
name[i-1] = cur.getString(indexName);
phoneType[i-1] = cur.getString(indexPhoneType);
String temp="id="+id+"-name="+name[i-1]+"-phoneType="+phoneType[i-1];
s[i-1]=temp;
i++;
}
}
Upvotes: 0
Reputation: 22822
Your name and phone arrays have not been initialized.
String[] name = new String[EXPECTED_SIZE];
String[] phoneType = new String[EXPECTED_SIZE];
Any proper IDE should tell you that before you try to run it. Are you using Eclipse or IntelliJ? You should!
Upvotes: 1
Reputation: 10346
You're not initializing your String[] name, so when you try to access it, you get a null pointer exception. I would suggest using more meaningful variable names. 'name' is very ambiguous.
Upvotes: 1