2017-05-16 7 views
0

안녕하세요 GridView를 사용하여 간단한 갤러리를 만들고 싶습니다. 대화 상자 안에 넣고 싶습니다. 나는 약간의 코드를 썼지 만 모든 것이 작동하지 않는다. 어댑터가 비어있는 오류가 발생합니다. 어떻게 생겼을 까? 내 코드는 지금과 같이 보인다 :GridView 안의 안드로이드 갤러리

GuidePhotoAlbum 코드 :

LayoutInflater inflater; 
    View v; 
    GridView gV; 
    public ArrayList<File> list; 

    public class GuidePhotoAlbum extends Activity 
    { 
     @Override public void onCreate(Bundle savedInstanceState){ 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.guide_photo_album); 
      list = imageReader(Environment.getExternalStorageDirectory()); 
    } 
private ArrayList<File> imageReader(File root) 
{ 
    ArrayList<File> a = new ArrayList<>(); 
    File[] files = root.listFiles(); 
    for(int i=0;i<files.length;i++) 
    { 
     if(files[i].isDirectory()) 
     { 
      a.addAll(imageReader(files[i])); 
     } 
     else 
     { 
      if (files[i].getName().endsWith(".jpg")) 
      { 
       a.add(files[i]); 
      } 
     } 
    } 
    return a; 
} 

    public void onClickk(View v) 
{ 
    openDialog2(); 
} 

    public void openDialog2() { 


      inflater = this.getLayoutInflater(); 
      v = inflater.inflate(R.layout.dialog_choice, null); 
      gV = new GridView(this); 
      gV = (GridView)findViewById(R.id.gridView); 
      gV.setAdapter(new GridAdapter()); 
      final AlertDialog.Builder builder2 = new AlertDialog.Builder(this); 
      builder2.setTitle("MY GALLERY"); 
      builder2.setView(v).setPositiveButton("NEXT", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

       } 
      }).setNegativeButton("BACK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

       } 
      }); 
      builder2.setCancelable(false); 
      builder2.create().show(); 
     } 

GridAdapter :

public class GridAdapter extends BaseAdapter { 
    GuidePhotoAlbum guidePhotoAlbum = new GuidePhotoAlbum(); 
    @Override 
    public int getCount() { 
     return guidePhotoAlbum.list.size(); 
    } 

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     convertView = guidePhotoAlbum.getLayoutInflater().inflate(R.layout.my_grid,parent,false); 
     ImageView iv = (ImageView) convertView.findViewById(R.id.imageView); 
     iv.setImageURI(Uri.parse(getItem(position).toString())); 
    return convertView; 
} 

} 

XML을의 dialog_choice 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/dialog_choice" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 


    <GridView 
     android:id="@+id/gridView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="5dp" 
     android:columnWidth="100dp" 
     android:drawSelectorOnTop="true" 
     android:gravity="center" 
     android:numColumns="auto_fit" 
     android:stretchMode="columnWidth" 
     android:verticalSpacing="5dp" 
     android:focusable="true" 
     android:clickable="true"/> 


</RelativeLayout> 

XML을 my_grid :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:id="@+id/imageView"/> 

</LinearLayout> 
,
+0

시도의 DialogFragment –

+0

도움이 될 것입니다 이 하나 ? –

+0

guidePhotoAlbum.list.size()> 0. 확인하십시오. 어댑터의 getCount() 메소드에 로그를 추가하여 목록 크기를 확인하십시오. – FAT

답변

0

업데이트 아래 GridAdapter :

public class GridAdapter extends BaseAdapter { 

    Context mContext; 
    ArrayList<File> listFiles; 

    public GridAdapter(Context context, ArrayList<File> files) { 

     this.mContext = context; 
     this.listFiles = files; 
    } 

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

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null) 
     { 
      convertView = LayoutInflater.from(mContext).inflate(R.layout.my_grid, parent, false); 
     } 

     ImageView iv = (ImageView) convertView.findViewById(R.id.imageView); 
     iv.setImageURI(Uri.parse(listFiles.get(position).toString())); 

     return convertView; 
    } 
} 

활동 GuidePhotoAlbum에서 context 통과 listGridAdapter에 :

public void openDialog2() { 

     inflater = this.getLayoutInflater(); 

     // Dialog layout 
     v = inflater.inflate(R.layout.dialog_choice, null); 

     // Get gridView from dialog_choice 
     gV = (GridView) v.findViewById(R.id.gridView); 

     // GridAdapter (Pass context and files list) 
     GridAdapter adapter = new GridAdapter(this, list); 

     // Set adapter 
     gV.setAdapter(adapter); 

     final AlertDialog.Builder builder2 = new AlertDialog.Builder(this); 
     builder2.setTitle("MY GALLERY"); 
     builder2.setView(v); 
     builder2.setPositiveButton("NEXT", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }).setNegativeButton("BACK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }); 
     builder2.setCancelable(false); 
     builder2.create().show(); 
    } 

희망이 ~ 뭐가 잘못

+0

그것은 작동합니다 :) 이제 메모리에 문제가 있습니다. :)이 파일을 디코딩해야합니다. ImageReader 메서드에서이 작업을 수행해야합니까? –

+0

글라이드 라이브러리를 사용하면 이미지를 효율적으로로드 할 수 있습니다. 매우 사용하기 쉽습니다. 설명서를 참조하십시오 : https://github.com/bumptech/glide – FAT

+0

그래도 나는이 방법 안에서 참작해야합니까? –