问题
I am receiving a NullPointerException when retreiving data from parse.com. I have traced through the program and I am indeed receiving data. I will copy in my source code for the adapter and done method.
FATAL EXCEPTION: main java.lang.NullPointerEXception at adapter.GroupChatAdapter.add(GroupChatFragment.java.79)
this is my custom add
public class GroupChatAdapter extends ArrayAdapter<GroupChat>{
private List<GroupChat> chat;
private Group subscrib;
private ListView listView;
public GroupChatAdapter(Context context,
int textViewResourceId) {
super(context,textViewResourceId);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent){
View v = convertView;
if(v == null){
LayoutInflater vi = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_row_group_chat, null);
}
GroupChat cht = chat.get(position);
if(cht != null){
TextView userNameText =(TextView) v.findViewById(R.id.userName);
TextView userPostText = (TextView) v.findViewById(R.id.userPost);
if(userNameText != null){
userNameText.setText(cht.userName);
}
if(userPostText!=null){
userPostText.setText(cht.userComment);
}
}
return v;
}
public void add(GroupChat chat){
this.chat.add(chat);
}
}
here is where the exception is happening
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_group_chat, container, false);
mListView = (ListView) rootView.findViewById(android.R.id.list);
return rootView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null && args.containsKey("groupName")){
groupNamePassed = args.getString("groupName");
}
chatsList = new ArrayList<GroupChat>();
mAdapter = new GroupChatAdapter(getActivity(),android.R.id.list);
ParseQuery<ParseObject> query = ParseQuery.getQuery("comments");
query.setLimit(1000);
query.whereEqualTo("groupName",groupNamePassed);
query.orderByAscending("createdAt");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
// TODO Auto-generated method stub
for (ParseObject groups : objects) {
chatchat = new GroupChat(groups.getString("user").toString(),groups.getString("groupComments").toString());
mAdapter.add(chatchat);
}
}
});
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
mListView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
messageToSend = (TextView)getView().findViewById(R.id.sendMessageText);
Button submitPost = (Button) getView().findViewById(R.id.sendMessageButton);
submitPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle args = getArguments();
if (args != null && args.containsKey("groupName")){
groupNamePassed = args.getString("groupName");
}
String message = messageToSend.getText().toString().trim();
ParseObject commentParse = new ParseObject("comments");
commentParse.put("groupName",groupNamePassed);
ParseUser user = ParseUser.getCurrentUser();
commentParse.put("user",user.get("username").toString());
commentParse.put("groupComments",message);
commentParse.saveInBackground();
mAdapter.add(new GroupChat(user.get("username").toString(),message));
mAdapter.notifyDataSetChanged();
}
});
}
mAdapter.add(chatchat) is causing my app to crash. I dont see what I have set up incorrectly. Any help would be appreciated...
回答1:
You are doing mistake in view assigning So you must follow this custom adapter it will help you definitely All the Best....
public class CustomAdapter extends ArrayAdapter<Sample> {
public ArrayList<Sample> mlist;
public Context context;
public LayoutInflater inflater;
public CustomAdapter(Context context, int resource, ArrayList<Sample> mlist) {
super(context, resource);
this.mlist = mlist;
this.context = context;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getPosition(Sample item) {
return super.getPosition(item);
}
@Override
public Sample getItem(int position) {
return mlist.get(position);
}
@Override
public int getCount() {
return mlist.size();
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = inflater.inflate(R.layout.listitem, null);//Replace your layout....
TextView text1 = (TextView) convertView.findViewById(R.id.item1);
TextView text2 = (TextView) convertView.findViewById(R.id.item2);
text1.setText(mlist.get(position).getListitem1());
text2.setText(mlist.get(position).getListitem2());
text2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// you just put your Logic here And use this custom adapter to
// load your Data By using this particular custom adapter to
// your listview
//Change your imageview here
}
});
return convertView;
}
}
回答2:
You are using your own "List chat" instead of the array provided by ArrayAdapter. In this case, you need to initialise the chat reference with an object (Java won't do it automatically). Without doing this, 'chat' points to a null/junk instance and doing chat.add() will throw a NullPointerException.
In your GroupChatAdapter constructer, add this line: chat = new List ();
The other option you have is to use the default list provided by ArrayAdapter. In this case, delete you chat object definition and the add(GroupChat) function definition. The adapter provides and add function automatically, which you can use the same way as you are doing in onCreate().
来源:https://stackoverflow.com/questions/22640457/android-parse-com-populate-listview-with-custom-adapter-issue