Null pointer exception when instantiating content parser?… here is a solution to the problem.
Null pointer exception when instantiating content parser?
In my Android, I’m reading contacts using a content parser. But the content parser is not initialized and it gives a NullPointerException
.
I want to use an array of strings in another class and get the value in it I have to query the database and read the contacts from the phone, but stick to the exception as noted in the code :
//this code is in some other class...
et= (EditText) findViewById(R.id.searchcontact);
et.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int
count) { // TODO Auto-generated method stub
lva.getFilter().filter(s);
RefreshListView rlv=new RefreshListView(); <----class is getting called from here
lva.notifyDataSetInvalidated();
lva = new ListViewAdapterContacts(AllContactsActivity.this, rlv.names, rlv.types, rlv.phones, rlv.ids);
lv.setAdapter(lva);
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) { // TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
TODO Auto-generated method stub
lva.notifyDataSetChanged();
}
});
...............********.........
public class RefreshListView extends ListActivity{
String[] names,phones,types,ids;
String name,id,phoneNumber;
int type;
ArrayList <String> newValues;
public void onCreate(Bundle b){
super.onCreate(b);
newValues=SetNewList.getNames();
getContacts();
}
public void getContacts(){
int foo = 0;
ContentResolver cr = getContentResolver(); <---//null pointer exception
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
+ ") ASC");
if (cur.getCount() > 0) {
names = new String[cur.getCount()];
phones = new String[cur.getCount()];
types = new String[cur.getCount()];
ids = new String[cur.getCount()];
while (cur.moveToNext()) {
name = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
for(int i=0; i<=newValues.size(); i++){
if(newValues.get(i).equalsIgnoreCase(name)) {
id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
String hasPhone = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (Integer.parseInt(hasPhone) == 1) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + id, null, null);
while (phones.moveToNext()) {
phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
} // while
phones.close();
}// if
else {
phoneNumber = "unknown";
type = 0;
}// else
phones[foo] = phoneNumber;
names[foo] = name;
ids[foo] = id;
if (type == 0) {
String value = "unknown";
types[foo] = value;
}
else if (type == 1) {
String value = "home";
types[foo] = value;
}// if
else if (type == 2) {
String value = "mobile";
types[foo] = value;
}// else if
else if (type == 3) {
String value = "Work";
types[foo] = value;
}
else if (type == 4) {
String value = "Workfax";
types[foo] = value;
}
else if (type == 5) {
String value = "Home Fax";
types[foo] = value;
} else if (type == 6) {
String value = "Pager";
types[foo] = value;
}
else {
String value = "Other";
types[foo] = value;
}
foo++;
}
}
}// while
}// if
}// get contacts
}
Solution
Don’t do this….
public class RefreshListView extends ListActivity{
public RefreshListView() {
...
}
}
Do not use constructor !!! for Android activities
You should remove the constructor and put the code in the Activity
onCreate(...)
method.
See and read the documentation for activity Activities .
Try something like this….
public class RefreshListView extends ListActivity{
String[] names,phones,types,ids;
String name,id,phoneNumber;
int type;
ArrayList <String> newValues;
ContentResolver cr = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cr = getContentResolver();
newValues=SetNewList.getNames();//getnames is of static type
getContacts();
}
public void getContacts() {
int foo = 0;
REMOVE THE NEXT LINE !!!
ContentResolver cr = getContentResolver();
...
}
}