Null Pointer Exception in LayoutInflator

老子叫甜甜 提交于 2019-12-13 01:14:27

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!