提交 26651f07 编写于 作者: D david 提交者: Sam Judd

Split interface to provide the size seperatly. Change interface on...

Split interface to provide the size seperatly. Change interface on `PreloadModelProvider` so preload items will requested one by one.
 - introduce new interface `PreloadSizeProvider`
 - change `PreloadModelProvider` preload items will requested one by one.
 - adapt Tests
 - adapt Samples
 - add two sample implementation for `PreloadSizeProvider`
      - `FixPreloadSizeProvider` to provide a size with a fixed width and height
      - `ViewPreloadSizeProvider` provide a size request from a given view using a `OnPreDrawListener`
上级 636df990
......@@ -24,18 +24,19 @@ public class ListPreloaderTest {
@Test
public void testGetItemsIsCalledIncreasing() {
final AtomicBoolean called = new AtomicBoolean(false);
final AtomicInteger calledCount = new AtomicInteger();
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
public List<Object> getPreloadItems(int start, int end) {
public Object getPreloadItem(int position) {
called.set(true);
assertEquals(11, start);
assertEquals(21, end);
return super.getPreloadItems(start, end);
final int count = calledCount.getAndIncrement();
assertEquals(11 + count, position);
return super.getPreloadItem(position);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter, 10);
preloader.onScroll(null, 1, 10, 30);
assertTrue(called.get());
assertEquals(10, calledCount.get());
}
@Test
......@@ -47,46 +48,46 @@ public class ListPreloaderTest {
}
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
int expectedPosition;
@Override
public int[] getPreloadDimensions(Object item, int pos) {
public int[] getPreloadSize(Object item, int pos) {
return new int[]{10, 10};
}
@Override
public List<Object> getPreloadItems(int start, int end) {
return objects;
public Object getPreloadItem(int position) {
return objects.get(position - 10);
}
@Override
public BitmapRequestBuilder getPreloadRequestBuilder(Object item, int pos) {
assertEquals(objects.get(expectedPosition), item);
expectedPosition++;
assertEquals(objects.get(pos - 10), item);
return mock(BitmapRequestBuilder.class);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, toPreload);
preloader.onScroll(null, 1, 10, 30);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter,
toPreload);
preloader.onScroll(null, 1, 10, 20);
}
@Test
public void testGetItemsIsCalledDecreasing() {
final AtomicBoolean called = new AtomicBoolean(false);
final AtomicInteger calledCount = new AtomicInteger();
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
public List<Object> getPreloadItems(int start, int end) {
public Object getPreloadItem(int position) {
// Ignore the preload caused from us starting at the end
if (start == 40) {
if (position >= 40) {
return Collections.emptyList();
}
final int count = calledCount.getAndIncrement();
called.set(true);
assertEquals(19, start);
assertEquals(29, end);
return super.getPreloadItems(start, end);
assertEquals(28 - count, position);
return super.getPreloadItem(position);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter, 10);
preloader.onScroll(null, 30, 10, 40);
preloader.onScroll(null, 29, 10, 40);
assertTrue(called.get());
......@@ -104,16 +105,16 @@ public class ListPreloaderTest {
int expectedPosition = toPreload - 1;
@Override
public int[] getPreloadDimensions(Object item, int pos) {
public int[] getPreloadSize(Object item, int pos) {
return new int[]{10, 10};
}
@Override
public List<Object> getPreloadItems(int start, int end) {
if (start == 40) {
return Collections.emptyList();
public Object getPreloadItem(int position) {
if (position == 40) {
return null;
}
return objects;
return objects.get(position);
}
@Override
......@@ -123,24 +124,26 @@ public class ListPreloaderTest {
return mock(BitmapRequestBuilder.class);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, toPreload);
preloader.onScroll(null, 30, 10, 40);
preloader.onScroll(null, 29, 10, 40);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter,
toPreload);
preloader.onScroll(null, 30, 10, 10);
preloader.onScroll(null, 29, 10, 10);
}
@Test
public void testGetItemsIsNeverCalledWithEndGreaterThanTotalItems() {
final AtomicBoolean called = new AtomicBoolean(false);
final AtomicInteger calledCount = new AtomicInteger();
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
public List<Object> getPreloadItems(int start, int end) {
public Object getPreloadItem(int position) {
called.set(true);
assertEquals(26, start);
assertEquals(30, end);
return super.getPreloadItems(start, end);
final int count = calledCount.getAndIncrement();
assertEquals(26 + count, position);
return super.getPreloadItem(position);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter, 10);
preloader.onScroll(null, 16, 10, 30);
assertTrue(called.get());
}
......@@ -148,20 +151,21 @@ public class ListPreloaderTest {
@Test
public void testGetItemsIsNeverCalledWithStartLessThanZero() {
final AtomicBoolean called = new AtomicBoolean(false);
final AtomicInteger calledCount = new AtomicInteger();
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
public List<Object> getPreloadItems(int start, int end) {
if (start == 17) {
public Object getPreloadItem(int position) {
if (position >= 17) {
return Collections.emptyList();
}
called.set(true);
assertEquals(0, start);
assertEquals(6, end);
return super.getPreloadItems(start, end);
final int count = calledCount.getAndIncrement();
assertEquals(5 - count, position);
return super.getPreloadItem(position);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter, 10);
preloader.onScroll(null, 7, 10, 30);
preloader.onScroll(null, 6, 10, 30);
assertTrue(called.get());
......@@ -172,24 +176,18 @@ public class ListPreloaderTest {
final AtomicInteger called = new AtomicInteger();
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
public List<Object> getPreloadItems(int start, int end) {
public Object getPreloadItem(int position) {
final int current = called.getAndIncrement();
if (current == 0) {
assertEquals(11, start);
assertEquals(21, end);
} else if (current == 1) {
assertEquals(21, start);
assertEquals(24, end);
}
return super.getPreloadItems(start, end);
assertEquals(11 + current, position);
return super.getPreloadItem(position);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter, 10);
preloader.onScroll(null, 1, 10, 30);
preloader.onScroll(null, 4, 10, 30);
assertEquals(2, called.get());
assertEquals(13, called.get());
}
@Test
......@@ -197,27 +195,21 @@ public class ListPreloaderTest {
final AtomicInteger called = new AtomicInteger();
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
public List<Object> getPreloadItems(int start, int end) {
if (start == 30) {
public Object getPreloadItem(int position) {
if (position >= 20) {
return Collections.emptyList();
}
final int current = called.getAndIncrement();
if (current == 0) {
assertEquals(10, start);
assertEquals(20, end);
} else if (current == 1) {
assertEquals(7, start);
assertEquals(10, end);
}
return super.getPreloadItems(start, end);
assertEquals(19 - current, position);
return super.getPreloadItem(position);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter, 10);
preloader.onScroll(null, 21, 10, 30);
preloader.onScroll(null, 20, 10, 30);
preloader.onScroll(null, 17, 10, 30);
assertEquals(2, called.get());
assertEquals(13, called.get());
}
@Test
......@@ -228,8 +220,8 @@ public class ListPreloaderTest {
final HashSet<Object> loadedObjects = new HashSet<Object>();
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
public List<Object> getPreloadItems(int start, int end) {
return objects;
public Object getPreloadItem(int position) {
return objects.get(position - 11);
}
@Override
......@@ -238,21 +230,20 @@ public class ListPreloaderTest {
return super.getPreloadRequestBuilder(item, pos);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 1, 10, 30);
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, preloaderAdapter, 10);
preloader.onScroll(null, 1, 10, 13);
assertThat(loadedObjects).containsAllIn(objects);
}
private static class ListPreloaderAdapter implements ListPreloader.PreloadModelProvider<Object> {
private static class ListPreloaderAdapter implements ListPreloader.PreloadModelProvider<Object>,
ListPreloader.PreloadSizeProvider<Object> {
public ListPreloaderAdapter() {
}
@Override
public List<Object> getPreloadItems(int start, int end) {
ArrayList<Object> result = new ArrayList<Object>(end - start);
Collections.fill(result, new Object());
return result;
public Object getPreloadItem(int position) {
return new Object();
}
@Override
......@@ -261,7 +252,7 @@ public class ListPreloaderTest {
}
@Override
public int[] getPreloadDimensions(Object item, int position) {
public int[] getPreloadSize(Object item, int position) {
return new int[]{100, 100};
}
}
......
......@@ -7,7 +7,6 @@ import com.bumptech.glide.request.target.BaseTarget;
import com.bumptech.glide.request.target.SizeReadyCallback;
import com.bumptech.glide.util.Util;
import java.util.List;
import java.util.Queue;
/**
......@@ -25,6 +24,7 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
private final int maxPreload;
private final PreloadTargetQueue preloadTargetQueue;
private final PreloadModelProvider<T> preloadModelProvider;
private final PreloadSizeProvider<T> preloadDimensionProvider;
private int lastEnd;
private int lastStart;
......@@ -34,22 +34,17 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
private boolean isIncreasing = true;
/**
* @param <U>
* An implementation of PreloadModelProvider should provide all the models that should be preloaded.
* @param <U> The type of the model being preloaded.
*/
public interface PreloadModelProvider<U> {
/**
* Returns a list of all models that need to be loaded for the list to display adapter items
* {@code start - end}.
* A list of any size can be returned so there can be multiple models per adapter position.
* @param start The smallest adapter position. Will be {@code >= 0 && < adapter.getCount() &&
* <= end}
* @param end The largest adapter position. Will be {@code >= 0 && < adapter.getCount && >=
* start}
* @return A non null list of all models for adapter positions between {@code start} and
* {@code end}.
* Returns a models that need to be loaded to display adapter item.
* @param position The position of the model in the adapter
* @return A nun null model that need to be loaded to display adapter item
*/
List<U> getPreloadItems(int start, int end);
U getPreloadItem(int position);
/**
* Returns a glide request for a given item. Must exactly match the request used to load the
......@@ -60,22 +55,30 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
* @return A non null {@link BitmapRequestBuilder}.
*/
GenericRequestBuilder getPreloadRequestBuilder(U item, int position);
}
/**
* @param <T>
*/
public interface PreloadSizeProvider<T> {
/**
* Returns the dimensions of the view in the list where the resources will be displayed.
* Returns the size of the view in the list where the resources will be displayed.
* <p>
* Note - The dimensions returned here must precisely match those of the view in the list.
* </p>
* @param item A model
* @param item A model
* @param position The position of the model in the adapter
* @return The dimensions of the view where the item will be displayed
*/
int[] getPreloadDimensions(U item, int position);
int[] getPreloadSize(T item, int position);
}
public ListPreloader(PreloadModelProvider<T> preloadModelProvider, int maxPreload) {
public ListPreloader(PreloadModelProvider<T> preloadModelProvider,
PreloadSizeProvider<T> preloadDimensionProvider, int maxPreload) {
this.preloadModelProvider = preloadModelProvider;
this.preloadDimensionProvider = preloadDimensionProvider;
this.maxPreload = maxPreload;
preloadTargetQueue = new PreloadTargetQueue(maxPreload + 1);
}
......@@ -97,18 +100,6 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
lastFirstVisible = firstVisible;
}
/**
* Returns the dimensions of the view in the list where the resources will be displayed.
* <p>
* Note - The dimensions returned here must precisely match those of the view in the list.
* </p>
* @param item A model
* @return The dimensions of the view where the item will be displayed
*/
protected int[] getDimensions(T item) {
return getDimensions(item, -1);
}
/**
* Returns the dimensions of the view in the list where the resources will be displayed.
* <p>
......@@ -119,34 +110,16 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
* @return The dimensions of the view where the item will be displayed
*/
protected int[] getDimensions(T item, int position) {
return this.preloadModelProvider.getPreloadDimensions(item, position);
}
/**
* Returns a list of all models that need to be loaded for the list to display adapter items
* {@code start - end}.
* A list of any size can be returned so there can be multiple models per adapter position.
* @param start The smallest adapter position. Will be {@code >= 0 && < adapter.getCount() &&
* <= end}
* @param end The largest adapter position. Will be {@code >= 0 && < adapter.getCount && >=
* start}
* @return A non null list of all models for adapter positions between {@code start} and
* {@code end}.
*/
protected List<T> getItems(int start, int end) {
return this.preloadModelProvider.getPreloadItems(start, end);
return this.preloadDimensionProvider.getPreloadSize(item, position);
}
/**
* Returns a glide request for a given item. Must exactly match the request used to load the
* resource in the list.
* The target and context will be provided by the preloader.
* @param item The model to load.
* @return A non null {@link BitmapRequestBuilder}.
* Returns a models that need to be loaded to display adapter item.
* @param position The position of the model in the adapter
* @return A nun null model that need to be loaded to display adapter item
*/
@SuppressWarnings("rawtypes")
protected GenericRequestBuilder getRequestBuilder(T item) {
return getRequestBuilder(item, -1);
protected T getItem(int position) {
return this.preloadModelProvider.getPreloadItem(position);
}
/**
......@@ -182,18 +155,16 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
}
end = Math.min(totalItemCount, end);
start = Math.min(totalItemCount, Math.max(0, start));
List<T> items = getItems(start, end);
if (from < to) {
// Increasing
final int numItems = items.size();
for (int i = 0; i < numItems; i++) {
preloadItem(items, i);
for (int i = start; i < end; i++) {
preloadItem(getItem(i), i);
}
} else {
// Decreasing
for (int i = items.size() - 1; i >= 0; i--) {
preloadItem(items, i);
for (int i = end - 1; i >= start; i--) {
preloadItem(getItem(i), i);
}
}
......@@ -202,11 +173,10 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
}
@SuppressWarnings("unchecked")
private void preloadItem(List<T> items, int position) {
final T item = items.get(position);
final int[] dimensions = getDimensions(item);
private void preloadItem(T item, int position) {
final int[] dimensions = getDimensions(item, position);
if (dimensions != null) {
getRequestBuilder(item).into(preloadTargetQueue.next(dimensions[0], dimensions[1]));
getRequestBuilder(item, position).into(preloadTargetQueue.next(dimensions[0], dimensions[1]));
}
}
......
package com.bumptech.glide.util;
import com.bumptech.glide.ListPreloader;
import java.util.Arrays;
/**
* A {@link com.bumptech.glide.ListPreloader.PreloadSizeProvider} with a fixed width and height.
* @param <T>
*/
public class FixedPreloadSizeProvider<T> implements ListPreloader.PreloadSizeProvider<T> {
private final int[] size;
/**
* Create a new PreloadSizeProvider with a fixed size.
* @param width The width of the preload size
* @param height The height of the preload size
*/
public FixedPreloadSizeProvider(int width, int height) {
this.size = new int[]{width, height};
}
@Override
public int[] getPreloadSize(T item, int position) {
return Arrays.copyOf(this.size, this.size.length);
}
}
package com.bumptech.glide.util;
import android.view.View;
import com.bumptech.glide.ListPreloader;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SizeReadyCallback;
import com.bumptech.glide.request.target.ViewTarget;
import java.util.Arrays;
/**
* A {@link com.bumptech.glide.ListPreloader.PreloadSizeProvider} that will extract the preload size from a given
* {@link android.view.View}.
* @param <T>
*/
public class ViewPreloadSizeProvider<T> implements ListPreloader.PreloadSizeProvider<T>, SizeReadyCallback {
private int[] size = null;
private SizeViewTarget viewTarget;
public ViewPreloadSizeProvider() {
// This constructor is intentionally empty. Nothing special is needed here.
}
/**
* A {@link com.bumptech.glide.ListPreloader.PreloadSizeProvider} that will extract the preload size from a given
* {@link android.view.View}.
* @param view A not null View the size will be extracted async with an {@link android.view.ViewTreeObserver
* .OnPreDrawListener}
*/
public ViewPreloadSizeProvider(View view) {
setView(view);
}
@Override
public int[] getPreloadSize(T item, int position) {
if (size == null) {
return null;
} else {
return Arrays.copyOf(this.size, this.size.length);
}
}
@Override
public void onSizeReady(int width, int height) {
this.size = new int[]{width, height};
this.viewTarget = null;
}
/**
* Set the {@link android.view.View} the size will be extracted.
* @param view A not null View the size will be extracted async with an {@link android.view.ViewTreeObserver
* .OnPreDrawListener}
*/
public void setView(View view) {
if (this.viewTarget == null) {
this.viewTarget = new SizeViewTarget(view, this);
}
}
private static final class SizeViewTarget extends ViewTarget<View, Object> {
public SizeViewTarget(View view, SizeReadyCallback callback) {
super(view);
getSize(callback);
}
@Override
public void onResourceReady(Object resource, GlideAnimation glideAnimation) {
// Do nothing
}
}
}
......@@ -18,6 +18,7 @@ import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.samples.flickr.api.Api;
import com.bumptech.glide.samples.flickr.api.Photo;
import com.bumptech.glide.util.FixedPreloadSizeProvider;
import java.util.ArrayList;
import java.util.List;
......@@ -73,9 +74,12 @@ public class FlickrPhotoGrid extends Fragment implements PhotoViewer {
final View result = inflater.inflate(R.layout.flickr_photo_grid, container, false);
grid = (GridView) result.findViewById(R.id.images);
grid.setColumnWidth(photoSize);
final ListPreloader<Photo> preloader = new ListPreloader<Photo>(adapter, args.getInt(PRELOAD_KEY));
grid.setOnScrollListener(preloader);
final FixedPreloadSizeProvider<Photo> preloadSizeProvider = new FixedPreloadSizeProvider(photoSize,
photoSize);
adapter = new PhotoAdapter();
final ListPreloader<Photo> preloader = new ListPreloader<Photo>(adapter, preloadSizeProvider,
args.getInt(PRELOAD_KEY));
grid.setOnScrollListener(preloader);
grid.setAdapter(adapter);
if (currentPhotos != null) {
adapter.setPhotos(currentPhotos);
......@@ -107,7 +111,6 @@ public class FlickrPhotoGrid extends Fragment implements PhotoViewer {
}
private class PhotoAdapter extends BaseAdapter implements ListPreloader.PreloadModelProvider<Photo> {
private final int[] dimens = new int[] { photoSize, photoSize };
private List<Photo> photos = new ArrayList<Photo>(0);
private final LayoutInflater inflater;
......@@ -165,18 +168,13 @@ public class FlickrPhotoGrid extends Fragment implements PhotoViewer {
}
@Override
public List<Photo> getPreloadItems(int start, int end) {
return photos.subList(start, end);
public Photo getPreloadItem(int position) {
return photos.get(position);
}
@Override
public GenericRequestBuilder getPreloadRequestBuilder(Photo item, int position) {
return preloadRequest;
}
@Override
public int[] getPreloadDimensions(Photo item, int position) {
return dimens;
return preloadRequest.load(item);
}
}
}
......@@ -20,6 +20,7 @@ import com.bumptech.glide.ListPreloader;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.samples.flickr.api.Api;
import com.bumptech.glide.samples.flickr.api.Photo;
import com.bumptech.glide.util.ViewPreloadSizeProvider;
import java.util.ArrayList;
import java.util.List;
......@@ -36,6 +37,7 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
private ListView list;
private DrawableRequestBuilder<Photo> fullRequest;
private DrawableRequestBuilder<Photo> thumbRequest;
private ViewPreloadSizeProvider<Photo> preloadSizeProvider;
public static FlickrPhotoList newInstance() {
return new FlickrPhotoList();
......@@ -55,7 +57,8 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
list = (ListView) result.findViewById(R.id.flickr_photo_list);
adapter = new FlickrPhotoListAdapter();
list.setAdapter(adapter);
preloader = new ListPreloader<Photo>(adapter, 5);
preloadSizeProvider = new ViewPreloadSizeProvider<Photo>();
preloader = new ListPreloader<Photo>(adapter, preloadSizeProvider, 5);
list.setOnScrollListener(preloader);
if (currentPhotos != null) {
adapter.setPhotos(currentPhotos);
......@@ -103,7 +106,6 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
}
private class FlickrPhotoListAdapter extends BaseAdapter implements ListPreloader.PreloadModelProvider<Photo> {
private int[] photoDimens = null;
private final LayoutInflater inflater;
private List<Photo> photos = new ArrayList<Photo>(0);
......@@ -141,9 +143,7 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
TextView titleView = (TextView) view.findViewById(R.id.title_view);
viewHolder = new ViewHolder(imageView, titleView);
view.setTag(viewHolder);
if (photoDimens == null) {
photoDimens = new int[]{imageView.getWidth(), imageView.getHeight()};
}
preloadSizeProvider.setView(imageView);
} else {
viewHolder = (ViewHolder) view.getTag();
}
......@@ -166,8 +166,8 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
}
@Override
public List<Photo> getPreloadItems(int start, int end) {
return photos.subList(start, end);
public Photo getPreloadItem(int position) {
return photos.get(position);
}
@Override
......@@ -176,10 +176,5 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
.thumbnail(thumbRequest.load(item))
.load(item);
}
@Override
public int[] getPreloadDimensions(Photo item, int position) {
return photoDimens;
}
}
}
......@@ -18,10 +18,9 @@ import com.bumptech.glide.GenericRequestBuilder;
import com.bumptech.glide.Glide;
import com.bumptech.glide.ListPreloader;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.util.ViewPreloadSizeProvider;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* The primary activity in the Giphy sample that allows users to view trending animated GIFs from Giphy's api.
......@@ -31,6 +30,7 @@ public class MainActivity extends Activity implements Api.Monitor {
private GifAdapter adapter;
private DrawableRequestBuilder<Api.GifResult> gifItemRequest;
private ViewPreloadSizeProvider<Api.GifResult> preloadSizeProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -52,9 +52,10 @@ public class MainActivity extends Activity implements Api.Monitor {
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.fitCenter();
adapter = new GifAdapter(this, gifItemRequest);
preloadSizeProvider = new ViewPreloadSizeProvider<Api.GifResult>();
adapter = new GifAdapter(this, gifItemRequest, preloadSizeProvider);
gifList.setAdapter(adapter);
ListPreloader<Api.GifResult> preloader = new ListPreloader<Api.GifResult>(adapter, 2);
ListPreloader<Api.GifResult> preloader = new ListPreloader<Api.GifResult>(adapter, preloadSizeProvider, 2);
gifList.setOnScrollListener(preloader);
}
......@@ -83,13 +84,15 @@ public class MainActivity extends Activity implements Api.Monitor {
private final Activity activity;
private DrawableRequestBuilder<Api.GifResult> requestBuilder;
private ViewPreloadSizeProvider<Api.GifResult> preloadSizeProvider;
private Api.GifResult[] results = EMPTY_RESULTS;
private int[] dimensions = null;
public GifAdapter(Activity activity, DrawableRequestBuilder<Api.GifResult> requestBuilder) {
public GifAdapter(Activity activity, DrawableRequestBuilder<Api.GifResult> requestBuilder,
ViewPreloadSizeProvider<Api.GifResult> preloadSizeProvider) {
this.activity = activity;
this.requestBuilder = requestBuilder;
this.preloadSizeProvider = preloadSizeProvider;
}
public void setResults(Api.GifResult[] results) {
......@@ -144,30 +147,19 @@ public class MainActivity extends Activity implements Api.Monitor {
.load(result)
.into(gifView);
if (dimensions == null) {
dimensions = new int[]{gifView.getWidth(), gifView.getHeight()};
}
preloadSizeProvider.setView(gifView);
return convertView;
}
@Override
public List<Api.GifResult> getPreloadItems(int start, int end) {
List<Api.GifResult> items = new ArrayList<Api.GifResult>(end - start);
for (int i = start; i < end; i++) {
items.add(getItem(i));
}
return items;
public Api.GifResult getPreloadItem(int position) {
return getItem(position);
}
@Override
public GenericRequestBuilder getPreloadRequestBuilder(Api.GifResult item, int position) {
return requestBuilder.load(item);
}
@Override
public int[] getPreloadDimensions(Api.GifResult item, int position) {
return dimensions;
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册