自定义 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
我正在尝试将 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