うさがにっき

読書感想文とプログラムのこと書いてきます

adapterのgetViewでnullpointerException

概要

adapterのgetViewの以下のコードでnullpointerExceptionとなった時の対処法

    view = View.inflate(mContext, R.layout.adapter, null);

ではなく

    view = View.inflate(mActivity.getApplicationContext(), R.layout.adapter, null);

とする

詳細

adapterを作成する際、以下のようにcontextをわたして作成したりする
fragment側

    listAdapter = new ListAdapter(mActivity.getApplicationContext() ,data);

adapter側

	public ListAdapter(Context context, Data data) {
		super();
		mContext = context;
		mData = data;
	}

    /** 省略 **/

	@Override
	public View getView(final int position, View view, ViewGroup parent) {
		ViewHolder holder;
		
		if (view == null) {
			view = View.inflate(mContext, R.layout.adapter, null);
            /** 省略 **/

このadapterの作成方法だと、アプリがバックグラウンドに回ってメモリが解放された場合、nullpointerExcepitonが発生することがある
adapterに渡されたmContextが解放されてしまうからっぽい

これを防ぐためにadapterにわたすものはcontextではなくactivityを渡すようにする
fragment側

    listAdapter = new ListAdapter(mActivity ,data);

adapter側

	public ListAdapter(Activity activity, Data data) {
		super();
		mActivity = activity;
		mData = data;
	}

    /** 省略 **/

	@Override
	public View getView(final int position, View view, ViewGroup parent) {
		ViewHolder holder;
		
		if (view == null) {
			view = View.inflate(mActivity.getApplicationContext(), R.layout.adapter, null);
            /** 省略 **/