jeudi 24 mars 2016

ArrayList Null Pointer Exception - Android Cursor/Adapter

I am receiving the following error:

      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
                                                                           at midamcorp.com.burgerkingapp.gridAdapter.fillGrid(gridAdapter.java:53)
                                                                           at midamcorp.com.burgerkingapp.gridAdapter.<init>(gridAdapter.java:39)
                                                                           at midamcorp.com.burgerkingapp.lunchStandard.onCreate(lunchStandard.java:35)

The problem appears to be occuring in the gridApater class, but I am not sure why. Here is the code for gridAdapter:

package midamcorp.com.burgerkingapp;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Kelly Marchewa on 3/22/2016.
 */
public class gridAdapter extends BaseAdapter {
    private Context mContext;
    private int isLto;
    private int board;
    public Cursor items;

public ArrayList<String> itemNames;
    public int[] icons;
    public  int[] buildImages;

public gridAdapter(Context context) {
    mContext = context;
}
    public gridAdapter(Context context, int lto, int location) {
mContext = context;
    isLto = lto;
        board = location;
        fillGrid();
    }

    private void fillGrid() {
        databaseHelper dbHelper = new databaseHelper(mContext);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        items = db.rawQuery("SELECT " + databaseHelper.ITEM_NAME + ", " + databaseHelper.ICON + ", " + databaseHelper.IMAGE + " FROM " + databaseHelper.TABLE_NAME + " where " + databaseHelper.LTO + " = " + isLto + " and " + databaseHelper.LOCATION + " = " + board, null);
        items.moveToFirst();
        icons = new int[items.getCount()];
        buildImages = new int[items.getCount()];
int counter = 0;

        while(!items.isAfterLast()) {

            itemNames.add(items.getString(items.getColumnIndex(databaseHelper.ITEM_NAME)));
            icons[counter] = (items.getInt(items.getColumnIndex(databaseHelper.ICON)));
            buildImages[counter] = (items.getInt(items.getColumnIndex(databaseHelper.IMAGE)));
            counter++;
            items.moveToNext();
        }
        items.close();

    }
    @Override
    public int getCount() {
return itemNames.size();
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return buildImages[position];
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater layout = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = layout.inflate(R.layout.grid_item, parent, false);

        TextView gridItemName = (TextView)view.findViewById(R.id.gridItemName);


        ImageView iconContainer = (ImageView)view.findViewById(R.id.gridItemIcon);

        gridItemName.setText(itemNames.get(position));

        iconContainer.setImageResource(icons[position]);

        return view;
    }
}

and the calling code:

i

mport android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.preference.Preference;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TableRow;
import android.widget.TextView;

public class lunchHome extends AppCompatActivity {
private SimpleCursorAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      int discriminator = 0;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lunch_home);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        databaseHelper dbHelper = new databaseHelper(this);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        SharedPreferences preferences = getSharedPreferences("config", MODE_PRIVATE);
        if(preferences.getInt("Location", 2) == 3) {
            discriminator = 3;
        } else if(preferences.getInt("Location", 2) == 2){
            discriminator = 2;
        }

        Button ltoButton = (Button)findViewById(R.id.lunchLTOButton);
        Button standardButton = (Button)findViewById(R.id.lunchMainButton);

        standardButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(lunchHome.this, lunchStandard.class);
                startActivity(intent);

            }
        });

        ltoButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(lunchHome.this, lunchLTOs.class);
                startActivity(intent);
            }
        });






Cursor results = db.rawQuery("SELECT _id, name, icon, buildImage FROM " + databaseHelper.TABLE_NAME + " WHERE location = " + discriminator + " and LTO = " + 1 + " LIMIT 3", null);

String[] from = new String [] {databaseHelper.ITEM_NAME};
int[] to = new int[] {R.id.newName};

        adapter = new SimpleCursorAdapter(this, R.layout.item_list, results, from, to, 0);
        final ListView listContainer = (ListView) findViewById(R.id.listContainer);
        listContainer.setAdapter(adapter);

        listContainer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Cursor cursor = (Cursor) listContainer.getItemAtPosition(position);
                int imageId = cursor.getInt(cursor.getColumnIndex("buildImage"));
Intent intent = new Intent(lunchHome.this, midamcorp.com.burgerkingapp.buildImage.class);
                intent.putExtra("imageID", imageId );
                startActivity(intent);

            }
        });


        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

}

and the Activity it is supposed to go to:

public class lunchLTOs extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lunch_ltos);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        GridView grid = (GridView)findViewById(R.id.lunchLTOGrid);
        SharedPreferences preferences = getSharedPreferences("config", MODE_PRIVATE);
        int discriminator = 2;

        if(preferences.getInt("Location", 2) == 3) {
            discriminator = 3;
        } else if(preferences.getInt("Location", 2) == 2){
            discriminator = 2;
        }

        gridAdapter adapter = new gridAdapter(this, 1, discriminator);
        grid.setAdapter(adapter);


grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(lunchLTOs.this, buildImage.class);
        intent.putExtra("position", position);
        startActivity(intent);
    }
});

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

}

I apologize for all the questions, but truly, truly appreciate any help. I know perhaps one of the most obvious solutions might be that the database query is not returning anything. Personally (its complicated), but I am not in the position right now to set some breakpoints or logs to see if the query is returning results. However, I believe if it the problem were the query, I would probably be getting an error earlier, such as at "icons = new int[items.getCount()];", right? What else could it be? Than you so much!

Aucun commentaire:

Enregistrer un commentaire