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;
}
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? –
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
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