自定义抽屉适配器中Inflater上的Nullpointer异常

时间:2015-07-02 22:15:43

标签: android navigation-drawer layout-inflater null-pointer

我正在尝试为我的导航抽屉创建一个自定义适配器,并继续在布局inflater上获得nullpointer异常。我已尝试按照其他帖子中的建议在LayoutInflater方法内外声明getView变量,但无济于事。

以下是我的自定义适配器类

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;
}

以下是我在onCreate()方法

中的MainActivity中调用它的位置
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();

}

和我的堆栈跟踪

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)

2 个答案:

答案 0 :(得分:1)

这一行this.mContext = mContext;应该是DrawerListAdapter构造函数中的mContext = context;

答案 1 :(得分:0)

改变

    @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;
}

这里有一个例子来管理适配器和AbsView

Example of ListAdapter AbsView & PlaceHolder pattern