问题
I am getting a Null Pointer Exception at LayoutInflator in my ExpandListAdapter class that extends BaseExpandableListAdaptor.
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
public class ExpandListAdapter extends BaseExpandableListAdapter{
private Context context;
private ArrayList<ExpandListGroup> groups;
public ExpandListAdapter(Context context, ArrayList<ExpandListGroup> groups){
this.context=context;
this.groups=groups;
}
public void addItem(ExpandListChild item, ExpandListGroup group){
if(!groups.contains(group)){
groups.add(group);
}
int index=groups.indexOf(group);
ArrayList<ExpandListChild> ch=groups.get(index).getItems();
ch.add(item);
groups.get(index).setItems(ch);
}
public Object getChild(int groupPosition, int childPosition){
ArrayList<ExpandListChild> chList=groups.get(groupPosition).getItems();
return chList.get(childPosition);
}
public long getChildId(int groupPosition, int childPosition){
return childPosition;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view, ViewGroup parent){
ExpandListChild child = (ExpandListChild) getChild(groupPosition, childPosition);
if (view == null) {
LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
view = infalInflater.inflate(R.layout.expandlist_child_item, null);
}
TextView tv = (TextView) view.findViewById(R.id.tvChild);
tv.setText(child.getName().toString());
tv.setTag(child.getTag());
// TODO Auto-generated method stub
return view;
}
public int getChildrenCount(int groupPosition) {
ArrayList<ExpandListChild> chList = groups.get(groupPosition).getItems();
return chList.size();
}
public Object getGroup(int groupPosition) {
return groups.get(groupPosition);
}
public int getGroupCount() {
return groups.size();
}
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isLastChild, View view, ViewGroup parent) {
ExpandListGroup group = (ExpandListGroup) getGroup(groupPosition);
if (view == null) {
LayoutInflater inf = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
view = inf.inflate(R.layout.two_lines_list_layout, null);
}
TextView tv = (TextView) view.findViewById(R.id.line_book);
tv.setText(group.getName());
TextView tv2 = (TextView) view.findViewById(R.id.line_author);
tv2.setText(group.getAuthor());
return view;
}
public boolean hasStableIds() {
// TODO Auto-generated method stub
return true;
}
public boolean isChildSelectable(int arg0, int arg1) {
// TODO Auto-generated method stub
return true;
}
}
I am getting exception at the line: LayoutInflater infalInflater = (LayoutInflater)this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
Also, its showing a warning at that line saying "The static field Context.LAYOUT_INFLATER_SERVICE should be accessed in a static way"
Please Help..!!
回答1:
So first the easy part. The warning that says you should access LAYOUT_INFLATER_SERVICE in a static way wants you to change it from context.LAYOUT_INFLATER_SERVICE to Context.LAYOUT_INFLATER_SERVICE (capitol 'C') so you are accessing the variable through the class rather than the instance.
Second, the null pointer exception is definitely happening on your 'context' variable, so whenever you are instantiating ExpandListAdapter, you are giving it a null value for context. You didn't give me that code, so I can't look into it, but I would recommend instantiating your ExpandListAdapter in onCreateView or onViewCreated. If you are creating this in an activity, pass it a reference to the activity (i.e. 'this'), and if you are creating it in a fragment pass it a call to getActivity(). This won't work though if your Fragment isn't attached to the activity though (which may be your issue).
回答2:
I am getting exception at the line: LayoutInflater infalInflater = (LayoutInflater)this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
That is because context
is null
. Make sure that you are passing in your Activity
to the ExpandListAdapter
constructor.
Also, its showing a warning at that line saying "The static field Context.LAYOUT_INFLATER_SERVICE should be accessed in a static way"
Change your constructor to take an Activity
rather than a Context
, then change:
LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
to:
LayoutInflater infalInflater = whateverYouDecideToCallYourActivityDataMember.getLayoutInflater();
来源:https://stackoverflow.com/questions/17767227/null-pointer-exception-in-layoutinflator