blob: 102e9b0540e370e69e6e54075b3fa5ca0e465ef4 [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.ImageView;
import android.widget.ListView;
import android.widget.TextView;
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 FlickrPhotoList extends SherlockFragment implements PhotoViewer {
private static final String STATE_POSITION_INDEX = "state_position_index";
private static final String STATE_POSITION_OFFSET = "state_position_offset";
private FlickrPhotoListAdapter adapter;
private List<Photo> currentPhotos;
private FlickrListPreloader preloader;
private ListView list;
public static FlickrPhotoList newInstance() {
return new FlickrPhotoList();
}
@Override
public void onPhotosUpdated(List<Photo> photos) {
currentPhotos = photos;
if (adapter != null) {
adapter.setPhotos(currentPhotos);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View result = inflater.inflate(R.layout.flickr_photo_list, container, false);
list = (ListView) result.findViewById(R.id.flickr_photo_list);
adapter = new FlickrPhotoListAdapter();
list.setAdapter(adapter);
preloader = new FlickrListPreloader(getActivity(), 5);
list.setOnScrollListener(preloader);
if (currentPhotos != null) {
adapter.setPhotos(currentPhotos);
}
if (savedInstanceState != null) {
int index = savedInstanceState.getInt(STATE_POSITION_INDEX);
int offset = savedInstanceState.getInt(STATE_POSITION_OFFSET);
list.setSelectionFromTop(index, offset);
}
return result;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (list != null) {
int index = list.getFirstVisiblePosition();
View topView = list.getChildAt(0);
int offset = topView != null ? topView.getTop() : 0;
outState.putInt(STATE_POSITION_INDEX, index);
outState.putInt(STATE_POSITION_OFFSET, offset);
}
}
private static class ViewHolder {
private final TextView titleText;
private final ImageView imageView;
public ViewHolder(ImageView imageView, TextView titleText) {
this.imageView = imageView;
this.titleText = titleText;
}
}
private class FlickrListPreloader extends ListPreloader<Photo> {
private final Context context;
private int[] photoDimens = null;
public FlickrListPreloader(Context context, int maxPreload) {
super(maxPreload);
this.context = context;
}
public boolean isDimensSet() {
return photoDimens != null;
}
public void setDimens(int width, int height) {
if (photoDimens == null) {
photoDimens = new int[] { width, height };
}
}
@Override
protected int[] getDimensions(Photo item) {
return photoDimens;
}
@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)
.thumbnail(0.1f)
.centerCrop();
}
}
private class FlickrPhotoListAdapter extends BaseAdapter {
private final LayoutInflater inflater;
private List<Photo> photos = new ArrayList<Photo>(0);
public FlickrPhotoListAdapter() {
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 null;
}
@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 ViewHolder viewHolder;
if (view == null) {
view = inflater.inflate(R.layout.flickr_photo_list_item, container, false);
final ImageView imageView = (ImageView) view.findViewById(R.id.photo_view);
TextView titleView = (TextView) view.findViewById(R.id.title_view);
viewHolder = new ViewHolder(imageView, titleView);
view.setTag(viewHolder);
if (!preloader.isDimensSet()) {
imageView.post(new Runnable() {
@Override
public void run() {
preloader.setDimens(imageView.getWidth(), imageView.getHeight());
}
});
}
} else {
viewHolder = (ViewHolder) view.getTag();
}
Glide.with(FlickrPhotoList.this)
.loadFromImage(current)
.thumbnail(0.1f)
.centerCrop()
.animate(R.anim.fade_in)
.into(viewHolder.imageView);
viewHolder.titleText.setText(current.title);
return view;
}
}
}