Search code examples
javaandroidlistviewstringbuffer

NullPointerException at setAdapter of Custom ListView and syntax error at arraylist creation


I am trying to show the list of contacts in my phone as a list. I am storing individual list items in a string buffer but I am not able to convert it into the type List. list is a class that I have made.

list.java

public class list {
    public StringBuffer item;
    public list( StringBuffer title) {
        super();
        this.item = title;
    }
    public StringBuffer getTitle() {
        return item;
    }
    public void setTitle(StringBuffer title) {
        this.item = title;
    }
    @Override
    public String toString() {
        return item + "\n" ;
    }
}

listAdapter.java

public class listAdapter extends ArrayAdapter<list> {

    Context context;
    int layoutResourceId;
    list data[] = null;

    public listAdapter(Context context, int layoutResourceId, List<list> items) {
        super(context, layoutResourceId, items);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
    }

    /*private view holder class*/
    private class ViewHolder {
        TextView txtTitle;

    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        list list = getItem(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            holder.txtTitle = (TextView) convertView.findViewById(R.id.textView1);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        holder.txtTitle.setText(list.getTitle());


        return convertView;
    }
}

Fragment class

public class MainActivity extends Fragment {
    private ArrayList<StringBuffer> conNumbers;
    List<list> rowitems;
    ListView listview;
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.allcontacts, container, false);
        conNumbers = new ArrayList<>();
        listview=(ListView)getActivity().findViewById(R.id.list);
        rowitems=new ArrayList<>();
        fetchContacts();
        return v;
    }

    public void fetchContacts() {

        String phoneNumber = null;
        String email = null;

        Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI;
        String _ID = ContactsContract.Contacts._ID;
        String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
        String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;

        Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
        String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;

        Uri EmailCONTENT_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
        String EmailCONTACT_ID = ContactsContract.CommonDataKinds.Email.CONTACT_ID;
        String DATA = ContactsContract.CommonDataKinds.Email.DATA;

        StringBuffer output = new StringBuffer();

        ContentResolver contentResolver = getActivity().getContentResolver();

        Cursor cursor = contentResolver.query(CONTENT_URI, null, null, null, null);

        // Loop for every contact in the phone
        if (cursor.getCount() > 0) {

            while (cursor.moveToNext()) {

                String contact_id = cursor.getString(cursor.getColumnIndex(_ID));
                String name = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME));

                int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(HAS_PHONE_NUMBER)));

                if (hasPhoneNumber > 0) {

                    output.append("\n First Name:" + name);

                    // Query and loop for every phone number of the contact
                    Cursor phoneCursor = contentResolver.query(PhoneCONTENT_URI, null, Phone_CONTACT_ID + " = ?", new String[]{contact_id}, null);

                    while (phoneCursor.moveToNext()) {
                        phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(NUMBER));
                        output.append("\n Phone number:" + phoneNumber);


                    }

                    phoneCursor.close();

                    // Query and loop for every email of the contact
                    Cursor emailCursor = contentResolver.query(EmailCONTENT_URI, null, EmailCONTACT_ID + " = ?", new String[]{contact_id}, null);

                    while (emailCursor.moveToNext()) {

                        email = emailCursor.getString(emailCursor.getColumnIndex(DATA));

                        output.append("\nEmail:" + email);


                    }

                    emailCursor.close();
                }

                output.append("\n");
               }
            rowitems.add(output); *I get an error here saying add(packagename.list) cannot be applied to (java.lang.StringBuffer)*


        }

        listAdapter adapter=new listAdapter(getActivity(),R.layout.list_item,rowitems);
        listview.setAdapter(adapter);
}

Solution

  • rowitems need an object of list class.

    rowitems.add(new list(output));
    

    You should rename the list class to something more meaningful. Something like ContactDetailsList.

    Update

    For solving NullPointerException while setting adapter, change the following line,

    listview = (ListView) getActivity().findViewById(R.id.list);
    

    to

    listview = (ListView) v.findViewById(R.id.list);
    

    With getActivity().findViewById() you were trying to find a view that belongs to the parent Activity of the fragment.

    But you want to find a view in the current layout R.layout.allcontacts. So use findViewById on the currently inflated layout v.