2010-05-02 42 views
9

Tôi đã cố gắng tạo Chế độ xem lưới hình ảnh, với hình ảnh có trong thư mục Nội dung. Opening a File from assets folder in android liên kết đã giúp tôi bằng cách sử dụng bitmap để đọc nó. Mã hiện đang có là:Android - Hình ảnh từ thư mục Nội dung trong GridView

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

Ứng dụng của tôi đọc hình ảnh từ thư mục Tài sản nhưng không lặp qua các ô trong chế độ xem lưới. Tất cả các ô của chế độ xem lưới đều có cùng một hình ảnh được chọn từ bộ hình ảnh. Bất cứ ai có thể cho tôi biết làm thế nào để lặp qua các tế bào và vẫn có hình ảnh khác nhau?

Tôi có đoạn code trên trong một lớp ImageAdapter mà mở rộng lớp BaseAdapter, và trong lớp học chính của tôi, tôi đang liên kết đó với GridView của tôi bằng cách:

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

Cảm ơn rất nhiều sự giúp đỡ nào trước, Saran

+0

Có một lý do cụ thể nào bạn đặt các giá trị này vào 'tài sản/'thay vì là tài nguyên có thể drawable không? – CommonsWare

+0

Thực ra tôi muốn tải những hình ảnh này một cách năng động và chúng có nhiều số. Khi tôi có chúng trong tài nguyên, tôi đã có vấn đề về trí nhớ.ContentProvider đã nhận được một ít trong tay, vì vậy tôi nghĩ rằng tôi sẽ cố gắng trong tài sản. - Saran – Saran

Trả lời

3

Không cần phải đọc tất cả các mục mỗi lần. Chỉ đọc mục ở vị trí được đưa ra trong lệnh gọi phương thức getView. Và chỉ hiển thị mục đó vào lúc đó.

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

Saran, bên dưới là những gì tôi sử dụng để hiển thị hình ảnh trong thư mục nội dung có thư viện. Tôi cho rằng đó là thỏa thuận tương tự với chế độ xem lưới:

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

bằng cách này, vì bạn muốn tải hình ảnh động (tôi có chúng được mã hóa cứng trong ví dụ của tôi), nếu tôi là bạn, tôi sẽ đặt hình ảnh trong một thư mục "tài sản" và sau đó sử dụng am.list (" [tên thư mục của bạn] "); điều này là bởi vì tôi đã thấy các tệp Android trong nội dung ngoài các tệp của riêng tôi –

+1

Phương thức getBitmapFromAsset() đang bỏ qua để đóng InputStream mà nó mở ra. –

+0

Cảm ơn !! Tôi đã cập nhật mã mẫu của mình –

Các vấn đề liên quan