2011-01-16 13 views
6

Tôi cố gắng phát triển một ứng dụng Android cho phép người dùng tìm nạp dữ liệu từ flickr và hiển thị nó trong một GridView (với một số hình động 3D đẹp). Sau khi một số cuộc phiêu lưu tôi đã nhận nó gần như chạy, nhưng bây giờ tôi đang bị mắc kẹt.Populating GridView với ImageViews động/lập trình sử dụng ImageAdapter


Dưới đây là các vấn đề:

Tôi có một UI Chủ đề "LoadPhotosTask" mà được các hình ảnh từ Flickr, giống như các ứng dụng mã nguồn mở photostream. Trong phương thức onProgressUpdate(LoadedPhoto... value) của lớp con tôi gọi addPhoto(). Cho đến bây giờ mọi thứ đều ổn - tôi có một số dữ liệu Bitmap và Flickr.photo tốt đẹp với tất cả thông tin tôi cần.

 @Override 
    public void onProgressUpdate(LoadedPhoto... value) { 

     addPhoto(value); 
    } 

Mặt khác, tôi đã có một GridView. Bây giờ tôi muốn điền nó với các bức ảnh. Nó đã có một bộ chuyển đổi gọi là ImageAdapter (mở rộng BaseAdapter, xem điều này tutorial). Nếu tôi sử dụng một mảng bên trong lớp ImageAdapter tôi có thể điền GridView với một số hình ảnh mẫu. Nhưng nếu tôi muốn cư trú trong thời gian chạy, tôi không biết phải làm gì.

Làm cách nào để thiết lập phương thức getView trong ImageAdapter? Tôi đã cố gắng để điền vào các mảng bên trong lớp ImageAdapter với các giá trị của tôi trong addPhoto, nhưng nó không hiển thị bất cứ điều gì.

Vì vậy, trước hết tôi đã thiết lập các mảng với số lượng hình ảnh tôi muốn hiển thị trong lưới điện như thế (mã nằm bên trong lớp ImageAdapter):

// class variable 
private ImageView[] mThumbIds; 

    [...] 

    public void setupArray(int count) { 
      this.mThumbIds = new ImageView[count]; 
     } 

Sau đó, tôi gọi phương pháp này với chiều dài của photolist tôi:

final Flickr.PhotoList list = params[0]; 
     final int count = list.getCount(); 
     int helper = 0; 
    imagead.setupArray(count); 

Sau đó tôi gọi phương thức getView bằng tay bên trong phương pháp addPhoto:

private void addPhoto(LoadedPhoto... value) { 

    ImageView image = (ImageView) mInflater.inflate(
    R.layout.grid_item_photo, null); 
    image.setImageBitmap(value[0].mBitmap); 
    image.setTag(value[0].mPhoto); 

    imagead.setmThumbIds(image, value[0].mPosition); 
    imagead.getView(value[0].mPosition, null, mpicturesGrid); 

} 

Đó là phương pháp getView bên ImageAdapter:

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

    if (convertView == null) { // if it's not recycled, initialize some 
     // attributes 

     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(EDGE_LENGTH, 
     EDGE_LENGTH)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(0, 0, 0, 0); 
     imageView.setVisibility(View.VISIBLE); 

    } else { 

     imageView = (ImageView) convertView; 
    } 
    imageView.setImageDrawable(mThumbIds[position].getDrawable()); 
    imageView.setTag(mThumbIds[position].getTag()); 

    return imageView; 

} 

Trả lời

9

Bạn đang thiếu một phần quan trọng.

Khi bạn sử dụng Adapter, bạn có phương thức được gọi là notifyDataSetChanged(). Logic bạn thiếu là:

Khi tạo Adapter cho GridView giữ nguyên tham chiếu cho danh sách bộ điều hợp sẽ sử dụng. Một cái gì đó như:

private ArrayList<Photo> mPhotos; 
private BaseAdapter mAdapter; 
private GridView mGridView; 

onCreate: 

/* other things here */ 

mAdapter = new MyAdapter(mPhotos); 
mGridView.setAdapter(mAdapter); 

gì bạn addPhoto nên làm như sau:

mPhotos.add(photo); 
mAdapter.notifyDataSetChanged(); 

Vậy là xong.

+0

Cảm ơn rất nhiều phản hồi của bạn. Tôi nghĩ đó là điểm. Cho phép xem ... Nếu tôi hiểu đúng, MyAdapter sẽ là ImageAdapter của tôi, phải không? Nhưng sau đó, mPhotos sẽ là bối cảnh? Tôi xin lỗi, tôi đọc qua một số tuts Adapter, nhưng tôi vẫn không hiểu. Làm cách nào để thiết lập ImageAdapter/MyAdapter một cách chính xác? –

+0

Có, MyAdapter == ImageAdapter.Không, mPhotos chỉ là một danh sách sẽ giữ các bức ảnh. Đối với trường hợp của bạn, nó sẽ là tốt hơn nếu bạn mở rộng ImageAdapter với ArrayAdapter trong hàm tạo, bạn có thể chuyển nó một danh sách các mục. – Macarse

+0

Cảm ơn vì điều này. Tôi đang làm điều tương tự với Thư viện. Tôi nghĩ rằng nhiều phương pháp sẽ được tìm thấy trong bộ điều hợp vì không có gì trong bộ sưu tập. SO không bao giờ thất bại tôi. :) – frostymarvelous