自定义 ListView 的 setAdapter 中的 NullPointerException 和创建数组列表时的语法错误

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

我正在尝试将 phone 中的联系人列表显示为列表。我将单个列表项存储在字符串缓冲区中,但无法将其转换为类型列表。列表是我制作的class。

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;
    }
}

片段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);
}

rowitems 需要 list class.

的对象
rowitems.add(new list(output));

您应该将 list class 重命名为更有意义的名称。类似于 ContactDetailsList.

更新

为了在设置适配器时解决NullPointerException,更改以下行,

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

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

对于 getActivity().findViewById(),您试图找到属于片段的父 Activity 的视图。

但是您想在当前布局中找到一个视图R.layout.allcontacts。因此,在当前膨胀的布局 v.

上使用 findViewById