0

So guys, I've been trying to do a gallery app for my phone using gridview container and here's my code:

Adapter Code:

package com.mahmoud.myapplication;

import android.content.Context;
import android.graphics.Camera;
import android.os.Environment;
import android.provider.ContactsContract;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import java.io.File;
import java.util.Dictionary;

/**
 * Created by mahmoud on 04/11/2015.
 */
public class ImageAdapter extends BaseAdapter {
    private Context context;
    File image_num = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    String[] listOfPictures = image_num.list();
    public ImageAdapter(Context context)
    {
        this.context = context;

    }
    @Override
    public int getCount() {

        return listOfPictures.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView iv;
        if(convertView == null)
        {
            iv = new ImageView(context);
            iv.setLayoutParams(new GridView.LayoutParams(100,100));
            iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
            iv.setPadding(8,8,8,8);
        }
        else
        {
            iv = (ImageView) convertView;
        }

        iv.setImageResource(Integer.parseInt(listOfPictures[position]));
        return iv;

    }
}

Main Activity:

package com.mahmoud.myapplication;

import android.app.Activity;
import android.os.Bundle;
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.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;

public class MainActivity extends Activity {


    GridView picGrid;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        picGrid = (GridView) findViewById(R.id.gridView);
        picGrid.setAdapter(new ImageAdapter(this));

    }

}

Error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mahmoud.myapplication/com.mahmoud.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array

any idea why this is happening, I know it's about me using the .length but I just don't know where exactly the mistake is. please note that the DCIM file is not empty (has pictures in it).

Rajesh Jadav
  • 12,801
  • 5
  • 53
  • 78
zach
  • 1
  • it seems like your array listOfPictures is null – Bhargav Thanki Nov 04 '15 at 13:20
  • Possible duplicate of [IllegalArgumentException or NullPointerException for a null parameter?](http://stackoverflow.com/questions/3881/illegalargumentexception-or-nullpointerexception-for-a-null-parameter) – Smittey Nov 04 '15 at 13:34

2 Answers2

0

EDIT: In your oncreate add this:

@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            picGrid = (GridView) findViewById(R.id.gridView);
            picGrid.setAdapter(new ImageAdapter(this,getFilePaths()));

        }

You can use this method to get list of all pictures in phone. Put this method in your MainActivity.java

public ArrayList<String> getFilePaths()
    {
        Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = {MediaStore.Images.ImageColumns.DATA};
        Cursor c = null;
        SortedSet<String> dirList = new TreeSet<>();
        Map<Long,String> resultIAV = new TreeMap<>();

        String[] directories = null;
        if (u != null)
        {
            c =  managedQuery(u, projection, null, null, null);
        }

        if ((c != null) && (c.moveToFirst())) {
            do {
                String tempDir = c.getString(0);
                tempDir = tempDir.substring(0, tempDir.lastIndexOf("/"));
                try {
                    dirList.add(tempDir);
                } catch (Exception e) {

                }
            }
            while (c.moveToNext());
            directories = new String[dirList.size()];
            dirList.toArray(directories);
        }

        for(int i=0;i<dirList.size();i++)
        {
            File imageDir = new File(directories[i]);
            File[] imageList = imageDir.listFiles();

            if(imageList == null)
                continue;
            for (File imagePath : imageList) {
                try {
                    if(imagePath.isDirectory())
                    {
                        imageList = imagePath.listFiles();

                    }
                    if ( imagePath.getName().contains(".jpg")|| imagePath.getName().contains(".JPG")
                            || imagePath.getName().contains(".jpeg")|| imagePath.getName().contains(".JPEG")
                            || imagePath.getName().contains(".png") || imagePath.getName().contains(".PNG")
                            || imagePath.getName().contains(".gif") || imagePath.getName().contains(".GIF")
                            || imagePath.getName().contains(".bmp") || imagePath.getName().contains(".BMP")
                            )
                    {
                        Long lastmodified= imagePath.lastModified();
                        //System.out.println("date: "+lastmodified);
                        String path= imagePath.getAbsolutePath();
                        resultIAV.put(lastmodified,path);

                    }
                }
                //  }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        ArrayList<String> np = new ArrayList<String>(resultIAV.values());
        Collections.reverse(np);

        return np;
    }

and then pass this arraylist to the adapter in Main Activity onCreate:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        picGrid = (GridView) findViewById(R.id.gridView);
        picGrid.setAdapter(new ImageAdapter(this,getFilePaths()));

    }

and modify your adapter code:

package com.mahmoud.myapplication;

import android.content.Context;
import android.graphics.Camera;
import android.os.Environment;
import android.provider.ContactsContract;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import java.io.File;
import java.util.Dictionary;

/**
 * Created by mahmoud on 04/11/2015.
 */
public class ImageAdapter extends BaseAdapter {
    private Context context;

    ArrayList<String> listOfPictures;
    public ImageAdapter(Context context,ArrayList<String> imagelist)
    {
        this.context = context;
        listOfPictures = imagelist;

    }
    @Override
    public int getCount() {

        return listOfPictures.size();
    }

    @Override
    public Object getItem(int position) {
       return listOfPictures.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView iv;
        if(convertView == null)
        {
            iv = new ImageView(context);
            iv.setLayoutParams(new GridView.LayoutParams(100,100));
            iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
            iv.setPadding(8,8,8,8);
        }
        else
        {
            iv = (ImageView) convertView;
        }

        iv.setImageResource(Integer.parseInt(listOfPictures[position]));
        return iv;

    }
}
Vishavjeet Singh
  • 1,385
  • 11
  • 13
  • When I do that I get this error on this line in mainactivity: picGrid.setAdapter(new ImageAdapter(this),getFilePaths()); Error: Error:(38, 28) error: constructor ImageAdapter in class ImageAdapter cannot be applied to given types; required: Context,ArrayList found: MainActivity reason: actual and formal argument lists differ in length – zach Nov 04 '15 at 13:51
  • I found the error and I have updated the oncreate code in mainactivity. Paste it in oncreate MainActivity. – Vishavjeet Singh Nov 04 '15 at 13:54
  • I have updated my answer i posted a wrong code for oncreate previously. Please use the updated code – Vishavjeet Singh Nov 04 '15 at 13:58
0

You are getting null from adapter, tey to use this type of code to fetch list of images on adapter.

File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File[] listOfImg = dcim.listFiles();

    Log.e("sizeee", ""+listOfImg.length);
Mohit Suthar
  • 8,725
  • 10
  • 37
  • 67