JD Jr.
JD Jr.

Reputation: 47

getView method causing NullPointerException

I'm getting a NullPointerException, when I'm trying to get some image from database I think my getter and setter method is wrong, any help is much appreciated.

This is my Activity

   public class ViewMoreDetailsImages extends Activity{

    ProgressBar progressbar_01;

    ListView lv_images;
    ImageAdapter imageAdapter;
    List<ImageInformation> imageInformationList = new ArrayList<ImageInformation>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_more_details_images);
        this.setTitle("LandDev Images");

        lv_images = (ListView)findViewById(R.id.lv_images);
        progressbar_01 = (ProgressBar) findViewById(R.id.progress_bar_01);

        displayImage();

        imageAdapter = new ImageAdapter(this, imageInformationList);

        lv_images.setAdapter(imageAdapter);
    }
    private class viewMoreImages extends AsyncTask<String, Void, List<String>>{
        Statement st;
        ResultSet rs;
        Connection con;
        byte[] img;
        Bitmap theImage;
        @Override
        protected void onPreExecute(){
                lv_images.setVisibility(View.GONE);
                progressbar_01.setVisibility(View.VISIBLE);
            super.onPreExecute();
        }
        @Override
        protected List<String> doInBackground(String... params) {
            List<String> result = new ArrayList<String>();
            try{
                String query_image = "SELECT Image FROM tbl_task_image WHERE Task_Id ='"+ ListOfTask.task_id +"'";
                con = MyConnection.connect();
                st = con.createStatement();
                rs = st.executeQuery(query_image);
                while(rs.next()){
                    img = rs.getBytes(1);
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 2;
                    options.inPurgeable = true;// is deprecated
                    theImage = Bitmap.createScaledBitmap(BitmapFactory.decodeByteArray(img, 0, img.length, options), 200, 200, true);
                    ByteArrayOutputStream buf = new ByteArrayOutputStream();
                    theImage.compress(Bitmap.CompressFormat.PNG, 0, buf);

                    ImageInformation imageInformation = new ImageInformation(theImage);
                    imageInformationList.add(imageInformation);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return result;
        }
        @Override
        protected void onPostExecute(List<String> result){
                lv_images.setVisibility(View.VISIBLE);
                progressbar_01.setVisibility(View.GONE);
            super.onPostExecute(result);
        }
    }
    public void displayImage() {
        viewMoreImages vmi = new viewMoreImages();
        vmi.execute();
    }
}

This is my Constructor:

public class ImageInformation {
    private Bitmap img;

    public ImageInformation(Bitmap img){
        this.img = img;
    }
       public Bitmap getImg() {
        return img;
    }

    public void setImg(Bitmap img) {
        this.img = img;
    }

This my Adapter:

public class ImageAdapter extends ArrayAdapter<ImageInformation> {

    List<ImageInformation> imageInformationList;

    public ImageAdapter(Context context, List<ImageInformation> imageInformationList) {
        super(context, R.layout.more_details_images, imageInformationList);
    }

    static class ImageHolder{
        ImageView more_details_images;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        ImageHolder holder = null;
        View v = convertView;
        if(v == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            v = inflater.inflate(R.layout.more_details_images, parent, false);
            holder = new ImageHolder();
            holder.more_details_images = (ImageView) v.findViewById(R.id.images);
            v.setTag(holder);
        }else{
            holder = (ImageHolder) v.getTag();
        }
        holder.more_details_images.setImageBitmap(imageInformationList.get(position).getImg()); // causing NullPointerException
        holder.more_details_images.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position,0);
            }
        });
        return v;
    }
}

This is my logcat

6-22 21:43:04.012  18024-18024/com.juanito.itdepartment.landdevtaskmonitoring E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.juanito.itdepartment.landdevtaskmonitoring, PID: 18024
    java.lang.NullPointerException
            at com.juanito.itdepartment.landdevtaskmonitoring.ImageAdapter.getView(ImageAdapter.java:45)
            at android.widget.AbsListView.obtainView(AbsListView.java:2263)
            at android.widget.ListView.makeAndAddView(ListView.java:1790)
            at android.widget.ListView.fillDown(ListView.java:691)
            at android.widget.ListView.fillFromTop(ListView.java:752)
            at android.widget.ListView.layoutChildren(ListView.java:1630)
            at android.widget.AbsListView.onLayout(AbsListView.java:2091)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
            at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1660)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1436)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:544)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

Upvotes: 0

Views: 391

Answers (1)

Daniel Nugent
Daniel Nugent

Reputation: 43322

It looks like you just need to set your local reference of imageInformationList in the constructor of your ImageAdapter class.

Since you never set it to the reference that is passed into the constructor, it is still null when you call imageInformationList.get(position).getImg() inside getView().

To fix it, just assign the local reference to the one passed into the constructor (and also rename the paramater so that you don't have multiple variables of the same name in the same scope).

public class ImageAdapter extends ArrayAdapter<ImageInformation> {

    List<ImageInformation> imageInformationList;

    //rename parameter name:
    public ImageAdapter(Context context, List<ImageInformation> imageInformationListParameter) {
        super(context, R.layout.more_details_images, imageInformationListParameter);

        imageInformationList = imageInformationListParameter; //added
    }

   //.................

Upvotes: 1

Related Questions