2015-11-04 33 views
0

所以,球員,我一直在嘗試使用GridView控件容器做我的電話一個畫廊的應用程序,這裏是我的代碼:錯誤Android Studio中的GridView應用

適配器代碼:

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; 

    } 
} 

主要活動:

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

    } 

} 

錯誤:

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

任何想法,爲什麼發生這種情況,我知道它用。長度是關於我,但我只是不知道確切位置的錯誤是。請注意DCIM文件不是空的(有圖片)。

+0

這似乎是您的數組listOfPictures是空的 –

+0

可能的複製[拋出:IllegalArgumentException或NullPointerException異常的空參數?](http://stackoverflow.com/questions/3881/illegalargumentexception-or-nullpointerexception-for-a -null參數) – Smittey

回答

0

編輯: 在你的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())); 

     } 

您可以使用此方法來獲取手機中的所有圖片的列表。將這個方法在你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; 
    } 

,然後通過此ArrayList的適配器主要活動的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())); 

    } 

和修改適配器代碼

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; 

    } 
} 
+0

當我這樣做,我就在這行mainactivity此錯誤: picGrid.setAdapter(新ImageAdapter(本),getFilePaths()); 錯誤: 錯誤:(38,28)誤差:類ImageAdapter構造ImageAdapter不能被應用到給定的類型; 必需:上下文ArrayList found:MainActivity 原因:實際和形式參數列表長度不同 – zach

+0

我找到了錯誤,並且我更新了mainactivity中的oncreate代碼。將其粘貼到創建MainActivity中。 –

+0

是的,我確實改變了它 – zach

0

您從適配器中獲取null,tey to使用這種類型的代碼來獲取適配器上的圖像列表。

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

    Log.e("sizeee", ""+listOfImg.length);