2010-05-02 3 views
9

저는 Assets 폴더에 이미지가있는 이미지의 그리드 뷰를 만드는 작업을하고 있습니다. Opening a File from assets folder in android 링크를 사용하여 비트 맵을 읽는 데 도움이되었습니다.안드로이드 - GridView의 Assets 폴더에있는 이미지

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

    try 
    { 
    AssetManager am = mContext.getAssets(); 
    String list[] = am.list(""); 
    int count_files = imagelist.length; 
    for(int i= 0;i<=count_files; i++) 
    { 
     BufferedInputStream buf = new BufferedInputStream(am.open(list[i])); 
     Bitmap bitmap = BitmapFactory.decodeStream(buf); 
     imageView.setImageBitmap(bitmap); 
     buf.close(); 
    } 
    } 
    catch (IOException e) 
    { 
    e.printStackTrace(); 
    } 
    } 

내 응용 프로그램이 Assets 폴더에서 이미지를 읽어 않지만, 그리드 뷰에서 셀을 반복하지 않습니다 : 현재 데 코드입니다. 격자보기의 모든 셀에는 이미지 집합에서 선택한 동일한 이미지가 있습니다. 아무도 세포를 통해 반복하고 다른 이미지가있는 방법을 말해 줄 수 있습니까?

은 내가 BaseAdapter 클래스를 확장하는 ImageAdapter 클래스에서 위의 코드를 가지고 있고, 내 메인 클래스에 나는에 의해 나의 gridview에와 있음을 연결하고있다 : 사전에 어떤 도움을

GridView gv =(GridView)findViewById(R.id.gridview); 
    gv.setAdapter(new ImageAdapter(this, assetlist));  

고마워 Saran

+0

드로어 블 리소스가 아닌 'assets /'에 이들을 넣을 특별한 이유가 있습니까? – CommonsWare

+0

실제로 이러한 이미지를 동적으로로드하려면 많은 수가 필요합니다. 리소스가있을 때 메모리 문제가있었습니다 .ContentProvider가 조금 손을 뻗치고 있었기 때문에 자산을 시험해 볼 것이라고 생각했습니다.- Saran – Saran

답변

3

매번 모든 항목을 읽을 필요가 없습니다. getView 메소드 호출로 지정된 위치의 항목만을 읽어들입니다. 그 시간에만 해당 항목을 표시하십시오.

BufferedInputStream buf = new BufferedInputStream(am.open(list[position])); 
19

다음은 내가 갤러리와 함께 assets 폴더에 이미지를 표시하는 데 사용하는 것입니다.

public class myActivitye extends Activity 
{ 
    private Gallery mGallery; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mGallery = (Gallery) findViewById(R.id.mygalleryinxml); 

     //load images into memory 
     mBitArray = new Bitmap[4]; 
     try 
     { 
      //these images are stored in the root of "assets" 
      mBitArray[0] = getBitmapFromAsset("pic1.png"); 
      mBitArray[1] = getBitmapFromAsset("pic2.png"); 
      mBitArray[2] = getBitmapFromAsset("pic3.png"); 
      mBitArray[3] = getBitmapFromAsset("pic4.png"); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     mGallery.setAdapter(new GalleryAdapter(this, mBitArray)); 
    } 

    public class GalleryAdapter extends BaseAdapter 
    { 
     //member variables 
     private Context mContext; 
     private Bitmap[] mImageArray; 

     //constructor 
     public GalleryAdapter(Context context, Bitmap[] imgArray) 
     { 
      mContext = context; 
      mImageArray = imgArray; 
     } 

     public int getCount() 
     { 
      return mImageArray.length; 
     } 

     public Object getItem(int position) 
     { 
      return position; 
     } 

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

     //returns the individual images to the widget as it requires them 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      final ImageView imgView = new ImageView(mContext); 

      imgView.setImageBitmap(mImageArray[position]); 

      //put black borders around the image 
      final RelativeLayout borderImg = new RelativeLayout(mContext); 
      borderImg.setPadding(20, 20, 20, 20); 
      borderImg.setBackgroundColor(0xff000000);//black 
      borderImg.addView(imgView); 
      return borderImg; 
     } 

    }//end of: class GalleryAdapter 


    /** 
    * Helper Functions 
    * @throws IOException 
    */ 
    private Bitmap getBitmapFromAsset(String strName) throws IOException 
    { 
     AssetManager assetManager = getAssets(); 

     InputStream istr = assetManager.open(strName); 
     Bitmap bitmap = BitmapFactory.decodeStream(istr); 
     istr.close(); 

     return bitmap; 
    } 
} 
+0

그런데 이미지를 동적으로로드하려면 (예를 들어 하드 코딩 한 것), 내가 "자산"폴더에 이미지를 넣은 다음 am.list (" [귀하의 폴더 이름] "); 이것은 내 자신의 파일 외에 자산 내에서 Android 파일을 보았 기 때문입니다. –

+1

getBitmapFromAsset() 메소드는 열리는 InputStream을 닫지 않으려 고합니다. –

+0

감사합니다 !! 샘플 코드를 업데이트했습니다. –