提交 636df990 编写于 作者: D david 提交者: Sam Judd

Use Interface instead of abstract ListPreloader

In your examples the ListAdapter and the final ListPreloader are
strongly connected. Using an Interface will remove this strong
connection.

Using an interface that an Adapter can implement has the following
advantages:
1. the dimensions don´t must be passed to the ListPreloader while the Adapter has the first access to the dimensions of the ImageView
2. you don´t have to pass the items to the ListPreloader, while the
Adapter already has the newest set of items (e.g.: CursorAdapter)
3. in most cases the ListAdapter already has an RequestBuilder, so
you don´t have to pass them twice
4. you get rid of an extra class (ListPrelaoder) you have to implement
上级 e34df449
......@@ -24,15 +24,16 @@ public class ListPreloaderTest {
@Test
public void testGetItemsIsCalledIncreasing() {
final AtomicBoolean called = new AtomicBoolean(false);
ListPreloaderAdapter preloader = new ListPreloaderAdapter(10) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
called.set(true);
assertEquals(11, start);
assertEquals(21, end);
return super.getItems(start, end);
return super.getPreloadItems(start, end);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 1, 10, 30);
assertTrue(called.get());
}
......@@ -45,35 +46,36 @@ public class ListPreloaderTest {
objects.add(new Object());
}
ListPreloader preloader = new ListPreloader(toPreload) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
int expectedPosition;
@Override
protected int[] getDimensions(Object item) {
return new int[] { 10, 10 };
public int[] getPreloadDimensions(Object item, int pos) {
return new int[]{10, 10};
}
@Override
protected List getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
return objects;
}
@Override
protected BitmapRequestBuilder getRequestBuilder(Object item) {
public BitmapRequestBuilder getPreloadRequestBuilder(Object item, int pos) {
assertEquals(objects.get(expectedPosition), item);
expectedPosition++;
return mock(BitmapRequestBuilder.class);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, toPreload);
preloader.onScroll(null, 1, 10, 30);
}
@Test
public void testGetItemsIsCalledDecreasing() {
final AtomicBoolean called = new AtomicBoolean(false);
ListPreloaderAdapter preloader = new ListPreloaderAdapter(10) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
// Ignore the preload caused from us starting at the end
if (start == 40) {
return Collections.emptyList();
......@@ -81,9 +83,10 @@ public class ListPreloaderTest {
called.set(true);
assertEquals(19, start);
assertEquals(29, end);
return super.getItems(start, end);
return super.getPreloadItems(start, end);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 30, 10, 40);
preloader.onScroll(null, 29, 10, 40);
assertTrue(called.get());
......@@ -97,29 +100,30 @@ public class ListPreloaderTest {
objects.add(new Object());
}
ListPreloader preloader = new ListPreloader(toPreload) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
int expectedPosition = toPreload - 1;
@Override
protected int[] getDimensions(Object item) {
return new int[] { 10, 10 };
public int[] getPreloadDimensions(Object item, int pos) {
return new int[]{10, 10};
}
@Override
protected List getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
if (start == 40) {
return Collections.emptyList();
return Collections.emptyList();
}
return objects;
}
@Override
protected BitmapRequestBuilder getRequestBuilder(Object item) {
public BitmapRequestBuilder getPreloadRequestBuilder(Object item, int pos) {
assertEquals(objects.get(expectedPosition), item);
expectedPosition--;
return mock(BitmapRequestBuilder.class);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, toPreload);
preloader.onScroll(null, 30, 10, 40);
preloader.onScroll(null, 29, 10, 40);
}
......@@ -127,15 +131,16 @@ public class ListPreloaderTest {
@Test
public void testGetItemsIsNeverCalledWithEndGreaterThanTotalItems() {
final AtomicBoolean called = new AtomicBoolean(false);
ListPreloaderAdapter preloader = new ListPreloaderAdapter(10) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
called.set(true);
assertEquals(26, start);
assertEquals(30, end);
return super.getItems(start, end);
return super.getPreloadItems(start, end);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 16, 10, 30);
assertTrue(called.get());
}
......@@ -143,18 +148,20 @@ public class ListPreloaderTest {
@Test
public void testGetItemsIsNeverCalledWithStartLessThanZero() {
final AtomicBoolean called = new AtomicBoolean(false);
ListPreloaderAdapter preloader = new ListPreloaderAdapter(10) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
if (start == 17) {
return Collections.emptyList();
}
called.set(true);
assertEquals(0, start);
assertEquals(6, end);
return super.getItems(start, end);
return super.getPreloadItems(start, end);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 7, 10, 30);
preloader.onScroll(null, 6, 10, 30);
assertTrue(called.get());
......@@ -163,9 +170,9 @@ public class ListPreloaderTest {
@Test
public void testDontPreloadItemsRepeatedlyWhileIncreasing() {
final AtomicInteger called = new AtomicInteger();
ListPreloaderAdapter preloader = new ListPreloaderAdapter(10) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
final int current = called.getAndIncrement();
if (current == 0) {
assertEquals(11, start);
......@@ -174,10 +181,11 @@ public class ListPreloaderTest {
assertEquals(21, start);
assertEquals(24, end);
}
return super.getItems(start, end);
return super.getPreloadItems(start, end);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 1, 10, 30);
preloader.onScroll(null, 4, 10, 30);
......@@ -187,9 +195,9 @@ public class ListPreloaderTest {
@Test
public void testDontPreloadItemsRepeatedlyWhileDecreasing() {
final AtomicInteger called = new AtomicInteger();
ListPreloaderAdapter preloader = new ListPreloaderAdapter(10) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
if (start == 30) {
return Collections.emptyList();
}
......@@ -201,10 +209,11 @@ public class ListPreloaderTest {
assertEquals(7, start);
assertEquals(10, end);
}
return super.getItems(start, end);
return super.getPreloadItems(start, end);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 21, 10, 30);
preloader.onScroll(null, 20, 10, 30);
preloader.onScroll(null, 17, 10, 30);
......@@ -217,45 +226,43 @@ public class ListPreloaderTest {
objects.add(new Object());
objects.add(new Object());
final HashSet<Object> loadedObjects = new HashSet<Object>();
ListPreloaderAdapter preloader = new ListPreloaderAdapter(10) {
ListPreloaderAdapter preloaderAdapter = new ListPreloaderAdapter() {
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
return objects;
}
@Override
protected GenericRequestBuilder getRequestBuilder(Object item) {
public GenericRequestBuilder getPreloadRequestBuilder(Object item, int pos) {
loadedObjects.add(item);
return super.getRequestBuilder(item);
return super.getPreloadRequestBuilder(item, pos);
}
};
ListPreloader<Object> preloader = new ListPreloader<Object>(preloaderAdapter, 10);
preloader.onScroll(null, 1, 10, 30);
assertThat(loadedObjects).containsAllIn(objects);
}
private static class ListPreloaderAdapter extends ListPreloader<Object> {
public ListPreloaderAdapter(int maxPreload) {
super(maxPreload);
}
private static class ListPreloaderAdapter implements ListPreloader.PreloadModelProvider<Object> {
@Override
protected int[] getDimensions(Object item) {
return new int[] { 100, 100 };
public ListPreloaderAdapter() {
}
@Override
protected List<Object> getItems(int start, int end) {
public List<Object> getPreloadItems(int start, int end) {
ArrayList<Object> result = new ArrayList<Object>(end - start);
Collections.fill(result, new Object());
return result;
}
@Override
protected GenericRequestBuilder getRequestBuilder(Object item) {
public GenericRequestBuilder getPreloadRequestBuilder(Object item, int position) {
return mock(BitmapRequestBuilder.class);
}
@Override
public int[] getPreloadDimensions(Object item, int position) {
return new int[]{100, 100};
}
}
}
......@@ -14,17 +14,17 @@ import java.util.Queue;
* Loads a few resources ahead in the direction of scrolling in any {@link AbsListView} so that images are in the memory
* cache just before the corresponding view in created in the list. Gives the appearance of an infinitely large image
* cache, depending on scrolling speed, cpu speed, and cache size.
*
* <p>
* Must be set using {@link AbsListView#setOnScrollListener(android.widget.AbsListView.OnScrollListener)}, or have its
* corresponding methods called from another {@link android.widget.AbsListView.OnScrollListener} to function.
* Must be set using {@link AbsListView#setOnScrollListener(android.widget.AbsListView.OnScrollListener)}, or have its
* corresponding methods called from another {@link android.widget.AbsListView.OnScrollListener} to function.
* </p>
*
* @param <T> The type of the model being displayed in the list.
*/
public abstract class ListPreloader<T> implements AbsListView.OnScrollListener {
public class ListPreloader<T> implements AbsListView.OnScrollListener {
private final int maxPreload;
private final PreloadTargetQueue preloadTargetQueue;
private final PreloadModelProvider<T> preloadModelProvider;
private int lastEnd;
private int lastStart;
......@@ -34,11 +34,48 @@ public abstract class ListPreloader<T> implements AbsListView.OnScrollListener {
private boolean isIncreasing = true;
/**
* Constructor for the preloader.
*
* @param maxPreload The maximum number of items in the list to load ahead (corresponds to adapter positions).
* @param <U>
*/
public ListPreloader(int maxPreload) {
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}.
*/
List<U> getPreloadItems(int start, int end);
/**
* 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.
* @param position The position of the model in the adapter
* @return A non null {@link BitmapRequestBuilder}.
*/
GenericRequestBuilder getPreloadRequestBuilder(U item, int position);
/**
* 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
* @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);
}
public ListPreloader(PreloadModelProvider<T> preloadModelProvider, int maxPreload) {
this.preloadModelProvider = preloadModelProvider;
this.maxPreload = maxPreload;
preloadTargetQueue = new PreloadTargetQueue(maxPreload + 1);
}
......@@ -49,7 +86,8 @@ public abstract class ListPreloader<T> implements AbsListView.OnScrollListener {
}
@Override
public void onScroll(AbsListView absListView, int firstVisible, int visibleCount, int totalCount) {
public void onScroll(AbsListView absListView, int firstVisible, int visibleCount,
int totalCount) {
totalItemCount = totalCount;
if (firstVisible > lastFirstVisible) {
preload(firstVisible + visibleCount, true);
......@@ -62,32 +100,67 @@ public abstract class ListPreloader<T> implements AbsListView.OnScrollListener {
/**
* 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.
* 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 abstract int[] getDimensions(T item);
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>
* Note - The dimensions returned here must precisely match those of the view in the list.
* </p>
* @param item A model
* @param position of the model
* @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}.
* 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}.
* @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 abstract List<T> getItems(int start, int end);
protected List<T> getItems(int start, int end) {
return this.preloadModelProvider.getPreloadItems(start, end);
}
/**
* Returns a glide request for a given item. Must exactly match the request used to load the resource in the list.
* 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}.
*/
@SuppressWarnings("rawtypes")
protected abstract GenericRequestBuilder getRequestBuilder(T item);
protected GenericRequestBuilder getRequestBuilder(T item) {
return getRequestBuilder(item, -1);
}
/**
* 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.
* @param position The position of the model in the adapter
* @return A non null {@link BitmapRequestBuilder}.
*/
@SuppressWarnings("rawtypes")
protected GenericRequestBuilder getRequestBuilder(T item, int position) {
return this.preloadModelProvider.getPreloadRequestBuilder(item, position);
}
private void preload(int start, boolean increasing) {
if (isIncreasing != increasing) {
......@@ -168,7 +241,8 @@ public abstract class ListPreloader<T> implements AbsListView.OnScrollListener {
private int photoWidth;
@Override
public void onResourceReady(Object resource, GlideAnimation<? super Object> glideAnimation) {
public void onResourceReady(Object resource,
GlideAnimation<? super Object> glideAnimation) {
// Do nothing.
}
......
......@@ -73,7 +73,7 @@ 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 FlickrPreloader preloader = new FlickrPreloader(args.getInt(PRELOAD_KEY));
final ListPreloader<Photo> preloader = new ListPreloader<Photo>(adapter, args.getInt(PRELOAD_KEY));
grid.setOnScrollListener(preloader);
adapter = new PhotoAdapter();
grid.setAdapter(adapter);
......@@ -106,30 +106,8 @@ public class FlickrPhotoGrid extends Fragment implements PhotoViewer {
}
}
private class FlickrPreloader extends ListPreloader<Photo> {
private class PhotoAdapter extends BaseAdapter implements ListPreloader.PreloadModelProvider<Photo> {
private final int[] dimens = new int[] { photoSize, photoSize };
public FlickrPreloader(int toPreload) {
super(toPreload);
}
@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 preloadRequest.load(item);
}
}
private class PhotoAdapter extends BaseAdapter {
private List<Photo> photos = new ArrayList<Photo>(0);
private final LayoutInflater inflater;
......@@ -185,5 +163,20 @@ public class FlickrPhotoGrid extends Fragment implements PhotoViewer {
return imageView;
}
@Override
public List<Photo> getPreloadItems(int start, int end) {
return photos.subList(start, end);
}
@Override
public GenericRequestBuilder getPreloadRequestBuilder(Photo item, int position) {
return preloadRequest;
}
@Override
public int[] getPreloadDimensions(Photo item, int position) {
return dimens;
}
}
}
......@@ -32,7 +32,7 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
private static final String STATE_POSITION_OFFSET = "state_position_offset";
private FlickrPhotoListAdapter adapter;
private List<Photo> currentPhotos;
private FlickrListPreloader preloader;
private ListPreloader<Photo> preloader;
private ListView list;
private DrawableRequestBuilder<Photo> fullRequest;
private DrawableRequestBuilder<Photo> thumbRequest;
......@@ -55,7 +55,7 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
list = (ListView) result.findViewById(R.id.flickr_photo_list);
adapter = new FlickrPhotoListAdapter();
list.setAdapter(adapter);
preloader = new FlickrListPreloader(5);
preloader = new ListPreloader<Photo>(adapter, 5);
list.setOnScrollListener(preloader);
if (currentPhotos != null) {
adapter.setPhotos(currentPhotos);
......@@ -102,42 +102,8 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
}
}
private class FlickrListPreloader extends ListPreloader<Photo> {
private class FlickrPhotoListAdapter extends BaseAdapter implements ListPreloader.PreloadModelProvider<Photo> {
private int[] photoDimens = null;
public FlickrListPreloader(int maxPreload) {
super(maxPreload);
}
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 fullRequest
.thumbnail(thumbRequest.load(item))
.load(item);
}
}
private class FlickrPhotoListAdapter extends BaseAdapter {
private final LayoutInflater inflater;
private List<Photo> photos = new ArrayList<Photo>(0);
......@@ -175,13 +141,8 @@ 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 (!preloader.isDimensSet()) {
imageView.post(new Runnable() {
@Override
public void run() {
preloader.setDimens(imageView.getWidth(), imageView.getHeight());
}
});
if (photoDimens == null) {
photoDimens = new int[]{imageView.getWidth(), imageView.getHeight()};
}
} else {
viewHolder = (ViewHolder) view.getTag();
......@@ -194,7 +155,7 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
viewHolder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
public void onClick(View view) {
Intent intent = FullscreenActivity.getIntent(getActivity(), current);
startActivity(intent);
}
......@@ -203,5 +164,22 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
viewHolder.titleText.setText(current.getTitle());
return view;
}
@Override
public List<Photo> getPreloadItems(int start, int end) {
return photos.subList(start, end);
}
@Override
public GenericRequestBuilder getPreloadRequestBuilder(Photo item, int position) {
return fullRequest
.thumbnail(thumbRequest.load(item))
.load(item);
}
@Override
public int[] getPreloadDimensions(Photo item, int position) {
return photoDimens;
}
}
}
......@@ -46,15 +46,15 @@ public class MainActivity extends Activity implements Api.Monitor {
.into(giphyLogoView);
ListView gifList = (ListView) findViewById(R.id.gif_list);
GiphyPreloader preloader = new GiphyPreloader(2);
gifItemRequest = Glide.with(this)
.from(Api.GifResult.class)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.fitCenter();
adapter = new GifAdapter(this, preloader, gifItemRequest);
adapter = new GifAdapter(this, gifItemRequest);
gifList.setAdapter(adapter);
ListPreloader<Api.GifResult> preloader = new ListPreloader<Api.GifResult>(adapter, 2);
gifList.setOnScrollListener(preloader);
}
......@@ -78,47 +78,17 @@ public class MainActivity extends Activity implements Api.Monitor {
adapter.setResults(result.data);
}
private class GiphyPreloader extends ListPreloader<Api.GifResult> {
private int[] dimensions;
public GiphyPreloader(int maxPreload) {
super(maxPreload);
}
@Override
protected int[] getDimensions(Api.GifResult item) {
return dimensions;
}
@Override
protected List<Api.GifResult> getItems(int start, int end) {
List<Api.GifResult> items = new ArrayList<Api.GifResult>(end - start);
for (int i = start; i < end; i++) {
items.add(adapter.getItem(i));
}
return items;
}
@Override
protected GenericRequestBuilder getRequestBuilder(Api.GifResult item) {
return gifItemRequest.load(item);
}
}
private static class GifAdapter extends BaseAdapter {
private static class GifAdapter extends BaseAdapter implements ListPreloader.PreloadModelProvider<Api.GifResult> {
private static final Api.GifResult[] EMPTY_RESULTS = new Api.GifResult[0];
private final Activity activity;
private final GiphyPreloader preloader;
private DrawableRequestBuilder<Api.GifResult> requestBuilder;
private Api.GifResult[] results = EMPTY_RESULTS;
private int[] dimensions = null;
public GifAdapter(Activity activity, GiphyPreloader preloader,
DrawableRequestBuilder<Api.GifResult> requestBuilder) {
public GifAdapter(Activity activity, DrawableRequestBuilder<Api.GifResult> requestBuilder) {
this.activity = activity;
this.preloader = preloader;
this.requestBuilder = requestBuilder;
}
......@@ -174,20 +144,30 @@ public class MainActivity extends Activity implements Api.Monitor {
.load(result)
.into(gifView);
if (preloader.dimensions == null) {
gifView.post(new Runnable() {
@Override
public void run() {
if (gifView.getWidth() > 0 && gifView.getHeight() > 0) {
preloader.dimensions = new int[2];
preloader.dimensions[0] = gifView.getWidth();
preloader.dimensions[1] = gifView.getHeight();
}
}
});
if (dimensions == null) {
dimensions = new int[]{gifView.getWidth(), gifView.getHeight()};
}
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;
}
@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.
先完成此消息的编辑!
想要评论请 注册