blob: 3d5e30ebabfe6066f5064ebb34d5020a85127a5b [file] [log] [blame]
package com.bumptech.glide.samples.flickr;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import com.actionbarsherlock.app.SherlockFragment;
import com.bumptech.glide.GenericRequestBuilder;
import com.bumptech.glide.Glide;
import com.bumptech.glide.ListPreloader;
import com.bumptech.glide.samples.flickr.api.Photo;
import java.util.ArrayList;
import java.util.List;
public class FlickrPhotoGrid extends SherlockFragment implements PhotoViewer {
private static final String STATE_POSITION_INDEX = "state_position_index";
private static final String IMAGE_SIZE_KEY = "image_size";
private static final String PRELOAD_KEY = "preload";
private PhotoAdapter adapter;
private List<Photo> currentPhotos;
private int photoSize;
private GridView grid;
public static FlickrPhotoGrid newInstance(int size, int preloadCount) {
FlickrPhotoGrid photoGrid = new FlickrPhotoGrid();
Bundle args = new Bundle();
args.putInt(IMAGE_SIZE_KEY, size);
args.putInt(PRELOAD_KEY, preloadCount);
photoGrid.setArguments(args);
return photoGrid;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle args = getArguments();
photoSize = args.getInt(IMAGE_SIZE_KEY);
final View result = inflater.inflate(R.layout.flickr_photo_grid, container, false);
grid = (GridView) result.findViewById(R.id.images);
grid.setColumnWidth(photoSize);
final FlickrPreloader preloader = new FlickrPreloader(getActivity(), args.getInt(PRELOAD_KEY));
grid.setOnScrollListener(preloader);
adapter = new PhotoAdapter();
grid.setAdapter(adapter);
if (currentPhotos != null) {
adapter.setPhotos(currentPhotos);
}
if (savedInstanceState != null) {
int index = savedInstanceState.getInt(STATE_POSITION_INDEX);
grid.setSelection(index);
}
return result;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (grid != null) {
int index = grid.getFirstVisiblePosition();
outState.putInt(STATE_POSITION_INDEX, index);
}
}
@Override
public void onPhotosUpdated(List<Photo> photos) {
currentPhotos = photos;
if (adapter != null)
adapter.setPhotos(currentPhotos);
}
private class FlickrPreloader extends ListPreloader<Photo> {
private final int[] dimens = new int[] { photoSize, photoSize };
private final Context context;
public FlickrPreloader(Context context, int toPreload) {
super(toPreload);
this.context = context;
}
@Override
protected int[] getDimensions(Photo item) {
return dimens;
}
@Override
protected List<Photo> getItems(int start, int end) {
return currentPhotos.subList(start, end);
}
@Override
protected GenericRequestBuilder getRequestBuilder(Photo item) {
return Glide.with(context)
.loadFromImage(item)
.centerCrop();
}
}
private class PhotoAdapter extends BaseAdapter {
private List<Photo> photos = new ArrayList<Photo>(0);
private final LayoutInflater inflater;
public PhotoAdapter() {
this.inflater = LayoutInflater.from(getActivity());
}
public void setPhotos(List<Photo> photos) {
this.photos = photos;
notifyDataSetChanged();
}
@Override
public int getCount() {
return photos.size();
}
@Override
public Object getItem(int i) {
return photos.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int position, View view, ViewGroup container) {
final Photo current = photos.get(position);
final ImageView imageView;
if (view == null) {
imageView = (ImageView) inflater.inflate(R.layout.flickr_photo_grid_item, container, false);
ViewGroup.LayoutParams params = imageView.getLayoutParams();
params.width = photoSize;
params.height = photoSize;
} else {
imageView = (ImageView) view;
}
Glide.with(FlickrPhotoGrid.this)
.loadFromImage(current)
.animate(R.anim.fade_in)
.centerCrop()
.into(imageView);
return imageView;
}
}
}