Nullpointer exception on Inflater in Custom Drawer

2019-09-18 06:09发布

问题:

I'm trying to make a custom adapter for my navigation drawer, and keep getting a nullpointer exception on the layout inflater. I've tried declaring the LayoutInflater variable inside and outside the getView method as suggested in other posts, but to no avail.

Below is my Custom Adapter Class

Context mContext;
private ArrayList<String> mValues = new ArrayList<String>();
LayoutInflater inflater;

public DrawerListAdapter(Context context, ArrayList<String> mValues) {
    super(context, R.layout.drawer_layout, mValues);

    this.mContext = mContext;
    this.mValues = mValues;
    inflater = LayoutInflater.from(mContext);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View rowView = convertView;

    if(rowView == null){
        rowView = inflater.inflate(R.layout.drawer_layout, parent, false);
    } else{
        Log.d("DEBUG", "rowView is not null");
    }

    TextView textView = (TextView) rowView.findViewById(R.id.drawer_text);

    switch (position) {
        case 0:
            textView.setBackgroundColor(mContext.getResources().getColor(R.color.materialRed));
            textView.setText(mValues.get(position));
            break;
        case 1:
            textView.setBackgroundColor(mContext.getResources().getColor(R.color.materialLightBlue));
            textView.setText(mValues.get(position));
            break;
        case 2:
            textView.setBackgroundColor(mContext.getResources().getColor(R.color.materialLightGreen));
            textView.setText(mValues.get(position));
            break;
        case 3:
            textView.setBackgroundColor(mContext.getResources().getColor(R.color.materialLime));
            textView.setText(mValues.get(position));
            break;

    }

    return rowView;
}

Here is where I call it in my MainActivity within the onCreate() method

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.activity_main);

    mDrawerTitles.add("Politics");
    mDrawerTitles.add("Technology");
    mDrawerTitles.add("Sports");
    mDrawerTitles.add("Books");

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(android.R.id.list);

    DrawerListAdapter drawerAdapter = new DrawerListAdapter(this, mDrawerTitles);
    mDrawerList.setAdapter(drawerAdapter);

    //mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    new HttpJSONLoader().execute();

}

and my stack trace

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
        at android.view.LayoutInflater.from(LayoutInflater.java:219)
        at net.rmoreno.lemonlime.DrawerListAdapter.<init>(DrawerListAdapter.java:26)
        at net.rmoreno.lemonlime.MainActivity.onCreate(MainActivity.java:49)
        at android.app.Activity.performCreate(Activity.java:5933)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)

           

回答1:

This line this.mContext = mContext; should be mContext = context; in DrawerListAdapter constructor.



回答2:

change that

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

    Context = parent.getContext()

    /** then check convertView & inflate view  & u can use placeHolder with setTag()*/
    rootView = LayoutInflater.from(context).inflate(R.layout....,parent,false);
    ....
    return rootView;
}

here u got example how to manage adapter and AbsView

Example of ListAdapter AbsView & PlaceHolder pattern