Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
沉迷打码的小凳子
glide
提交
5ebcfbd3
G
glide
项目概览
沉迷打码的小凳子
/
glide
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
glide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
5ebcfbd3
编写于
11月 20, 2014
作者:
D
david
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support different target-sizes for list items
上级
28a34b61
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
240 addition
and
121 deletion
+240
-121
library/src/androidTest/java/com/bumptech/glide/ListPreloaderTest.java
...ndroidTest/java/com/bumptech/glide/ListPreloaderTest.java
+157
-59
library/src/main/java/com/bumptech/glide/ListPreloader.java
library/src/main/java/com/bumptech/glide/ListPreloader.java
+73
-50
library/src/main/java/com/bumptech/glide/util/FixedPreloadSizeProvider.java
...ava/com/bumptech/glide/util/FixedPreloadSizeProvider.java
+1
-1
library/src/main/java/com/bumptech/glide/util/ViewPreloadSizeProvider.java
...java/com/bumptech/glide/util/ViewPreloadSizeProvider.java
+1
-1
samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java
...va/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java
+2
-2
samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoList.java
...va/com/bumptech/glide/samples/flickr/FlickrPhotoList.java
+2
-2
samples/giphy/src/main/java/com/bumptech/glide/samples/giphy/MainActivity.java
...n/java/com/bumptech/glide/samples/giphy/MainActivity.java
+4
-6
未找到文件。
library/src/androidTest/java/com/bumptech/glide/ListPreloaderTest.java
浏览文件 @
5ebcfbd3
...
...
@@ -3,14 +3,26 @@ package com.bumptech.glide;
import
static
com
.
google
.
common
.
truth
.
Truth
.
assertThat
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
import
static
org
.
junit
.
Assert
.
assertTrue
;
import
static
org
.
mockito
.
Mockito
.
atLeastOnce
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
times
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
com.bumptech.glide.request.target.SizeReadyCallback
;
import
com.bumptech.glide.request.target.Target
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.ArgumentCaptor
;
import
org.mockito.Mock
;
import
org.mockito.MockitoAnnotations
;
import
org.mockito.verification.VerificationMode
;
import
org.robolectric.RobolectricTestRunner
;
import
org.robolectric.annotation.Config
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Collections
;
import
java.util.HashSet
;
import
java.util.List
;
...
...
@@ -21,21 +33,31 @@ import java.util.concurrent.atomic.AtomicInteger;
@Config
(
manifest
=
Config
.
NONE
,
emulateSdk
=
18
)
public
class
ListPreloaderTest
{
@Mock
private
BitmapRequestBuilder
request
;
@Before
public
void
setUp
()
throws
Exception
{
MockitoAnnotations
.
initMocks
(
this
);
}
@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
List
<
Object
>
getPreloadItems
(
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
.
getPreloadItems
(
position
);
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
10
);
preloader
.
onScroll
(
null
,
1
,
10
,
30
);
assert
True
(
called
.
get
());
assert
Equals
(
10
,
calledCount
.
get
());
}
@Test
...
...
@@ -43,7 +65,7 @@ public class ListPreloaderTest {
final
int
toPreload
=
10
;
final
List
<
Object
>
objects
=
new
ArrayList
<
Object
>();
for
(
int
i
=
0
;
i
<
toPreload
;
i
++)
{
objects
.
add
(
new
Object
(
));
objects
.
add
(
new
Integer
(
i
));
}
ListPreloaderAdapter
preloaderAdapter
=
new
ListPreloaderAdapter
()
{
...
...
@@ -51,13 +73,13 @@ public class ListPreloaderTest {
public
int
expectedPosition
;
@Override
public
int
[]
getPreloadSize
(
Object
item
)
{
public
int
[]
getPreloadSize
(
Object
item
,
int
adapterPostion
,
int
itemPosition
)
{
return
new
int
[]{
10
,
10
};
}
@Override
public
List
<
Object
>
getPreloadItems
(
int
start
,
int
end
)
{
return
objects
;
public
List
<
Object
>
getPreloadItems
(
int
position
)
{
return
objects
.
subList
(
position
-
11
,
position
+
1
-
11
)
;
}
@Override
...
...
@@ -68,24 +90,25 @@ public class ListPreloaderTest {
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
toPreload
);
preloader
.
onScroll
(
null
,
1
,
10
,
3
0
);
toPreload
);
preloader
.
onScroll
(
null
,
1
,
10
,
2
0
);
}
@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
List
<
Object
>
getPreloadItems
(
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
.
getPreloadItems
(
position
);
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
10
);
...
...
@@ -106,16 +129,16 @@ public class ListPreloaderTest {
int
expectedPosition
=
toPreload
-
1
;
@Override
public
int
[]
getPreloadSize
(
Object
item
)
{
public
int
[]
getPreloadSize
(
Object
item
,
int
adapterPostion
,
int
itemPosition
)
{
return
new
int
[]{
10
,
10
};
}
@Override
public
List
<
Object
>
getPreloadItems
(
int
start
,
int
end
)
{
if
(
start
==
40
)
{
return
Collections
.
emptyList
()
;
public
List
<
Object
>
getPreloadItems
(
int
position
)
{
if
(
position
==
40
)
{
return
null
;
}
return
objects
;
return
objects
.
subList
(
position
,
position
+
1
)
;
}
@Override
...
...
@@ -126,20 +149,21 @@ public class ListPreloaderTest {
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
toPreload
);
preloader
.
onScroll
(
null
,
30
,
10
,
4
0
);
preloader
.
onScroll
(
null
,
29
,
10
,
4
0
);
preloader
.
onScroll
(
null
,
30
,
10
,
1
0
);
preloader
.
onScroll
(
null
,
29
,
10
,
1
0
);
}
@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
List
<
Object
>
getPreloadItems
(
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
.
getPreloadItems
(
position
);
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
10
);
...
...
@@ -150,16 +174,17 @@ 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
List
<
Object
>
getPreloadItems
(
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
.
getPreloadItems
(
position
);
}
};
...
...
@@ -174,16 +199,10 @@ public class ListPreloaderTest {
final
AtomicInteger
called
=
new
AtomicInteger
();
ListPreloaderAdapter
preloaderAdapter
=
new
ListPreloaderAdapter
()
{
@Override
public
List
<
Object
>
getPreloadItems
(
int
start
,
int
end
)
{
public
List
<
Object
>
getPreloadItems
(
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
.
getPreloadItems
(
position
);
}
};
...
...
@@ -191,7 +210,7 @@ public class ListPreloaderTest {
preloader
.
onScroll
(
null
,
1
,
10
,
30
);
preloader
.
onScroll
(
null
,
4
,
10
,
30
);
assertEquals
(
2
,
called
.
get
());
assertEquals
(
13
,
called
.
get
());
}
@Test
...
...
@@ -199,19 +218,13 @@ public class ListPreloaderTest {
final
AtomicInteger
called
=
new
AtomicInteger
();
ListPreloaderAdapter
preloaderAdapter
=
new
ListPreloaderAdapter
()
{
@Override
public
List
<
Object
>
getPreloadItems
(
int
start
,
int
end
)
{
if
(
start
==
3
0
)
{
public
List
<
Object
>
getPreloadItems
(
int
position
)
{
if
(
position
>=
2
0
)
{
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
.
getPreloadItems
(
position
);
}
};
...
...
@@ -219,7 +232,91 @@ public class ListPreloaderTest {
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
public
void
testMultipleItemsForPositionIncreasing
()
throws
NoSuchFieldException
{
final
List
<
Object
>
objects
=
new
ArrayList
<
Object
>();
objects
.
add
(
new
Object
());
objects
.
add
(
new
Object
());
ListPreloaderAdapter
preloaderAdapter
=
new
ListPreloaderAdapter
()
{
public
int
expectedPosition
=
(
1
+
10
)
*
2
;
@Override
public
List
<
Object
>
getPreloadItems
(
int
position
)
{
return
objects
;
}
@Override
public
int
[]
getPreloadSize
(
Object
item
,
int
adapterPostion
,
int
itemPosition
)
{
assertEquals
(
expectedPosition
/
2
,
adapterPostion
);
assertEquals
(
expectedPosition
%
2
,
itemPosition
);
expectedPosition
++;
return
itemPosition
==
0
?
new
int
[]{
10
,
11
}
:
new
int
[]{
20
,
21
};
}
@Override
public
GenericRequestBuilder
getPreloadRequestBuilder
(
Object
item
)
{
return
request
;
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
10
);
Iterable
<
Integer
>
expected
=
Arrays
.
asList
(
10
,
11
,
20
,
21
,
10
,
11
,
20
,
21
);
preloader
.
onScroll
(
null
,
1
,
10
,
1
+
10
+
2
);
List
<
Integer
>
allValues
=
getTagetsSizes
(
request
,
times
(
4
));
assertEquals
(
expected
,
allValues
);
}
@Test
public
void
testMultipleItemsForPositionDecreasing
()
throws
NoSuchFieldException
{
final
List
<
Object
>
objects
=
new
ArrayList
<
Object
>();
objects
.
add
(
new
Object
());
objects
.
add
(
new
Object
());
ListPreloaderAdapter
preloaderAdapter
=
new
ListPreloaderAdapter
()
{
int
expectedPosition
=
objects
.
size
()
*
2
-
1
;
@Override
public
List
<
Object
>
getPreloadItems
(
int
position
)
{
return
objects
;
}
@Override
public
int
[]
getPreloadSize
(
Object
item
,
int
adapterPostion
,
int
itemPosition
)
{
assertEquals
(
expectedPosition
/
2
,
adapterPostion
);
assertEquals
(
expectedPosition
%
2
,
itemPosition
);
expectedPosition
--;
return
itemPosition
==
0
?
new
int
[]{
10
,
11
}
:
new
int
[]{
20
,
21
};
}
@Override
public
GenericRequestBuilder
getPreloadRequestBuilder
(
Object
item
)
{
return
request
;
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
10
);
Iterable
<
Integer
>
expected
=
Arrays
.
asList
(
20
,
21
,
10
,
11
,
20
,
21
,
10
,
11
);
preloader
.
onScroll
(
null
,
3
,
2
,
3
+
2
);
preloader
.
onScroll
(
null
,
2
,
2
,
3
+
2
);
List
<
Integer
>
allValues
=
getTagetsSizes
(
request
,
times
(
4
));
assertEquals
(
expected
,
allValues
);
}
private
List
<
Integer
>
getTagetsSizes
(
BitmapRequestBuilder
requestBuilder
,
VerificationMode
callVerificationMode
)
{
ArgumentCaptor
<
Integer
>
integerArgumentCaptor
=
ArgumentCaptor
.
forClass
(
Integer
.
class
);
ArgumentCaptor
<
Target
>
targetArgumentCaptor
=
ArgumentCaptor
.
forClass
(
Target
.
class
);
SizeReadyCallback
cb
=
mock
(
SizeReadyCallback
.
class
);
VerificationMode
mode
=
atLeastOnce
();
verify
(
requestBuilder
,
mode
).
into
(
targetArgumentCaptor
.
capture
());
for
(
Target
target
:
targetArgumentCaptor
.
getAllValues
())
{
target
.
getSize
(
cb
);
}
verify
(
cb
,
mode
).
onSizeReady
(
integerArgumentCaptor
.
capture
(),
integerArgumentCaptor
.
capture
());
return
integerArgumentCaptor
.
getAllValues
();
}
@Test
...
...
@@ -230,8 +327,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
List
<
Object
>
getPreloadItems
(
int
position
)
{
return
objects
.
subList
(
position
-
11
,
position
-
10
)
;
}
@Override
...
...
@@ -241,7 +338,8 @@ public class ListPreloaderTest {
}
};
ListPreloader
<
Object
>
preloader
=
new
ListPreloader
<
Object
>(
preloaderAdapter
,
preloaderAdapter
,
10
);
preloader
.
onScroll
(
null
,
1
,
10
,
30
);
preloader
.
onScroll
(
null
,
1
,
10
,
13
);
assertThat
(
loadedObjects
).
containsAllIn
(
objects
);
}
...
...
@@ -252,8 +350,8 @@ public class ListPreloaderTest {
}
@Override
public
List
<
Object
>
getPreloadItems
(
int
start
,
int
end
)
{
ArrayList
<
Object
>
result
=
new
ArrayList
<
Object
>(
end
-
start
);
public
List
<
Object
>
getPreloadItems
(
int
position
)
{
ArrayList
<
Object
>
result
=
new
ArrayList
<
Object
>(
1
);
Collections
.
fill
(
result
,
new
Object
());
return
result
;
}
...
...
@@ -264,7 +362,7 @@ public class ListPreloaderTest {
}
@Override
public
int
[]
getPreloadSize
(
Object
item
)
{
public
int
[]
getPreloadSize
(
Object
item
,
int
adapterPostion
,
int
itemPosition
)
{
return
new
int
[]{
100
,
100
};
}
}
...
...
library/src/main/java/com/bumptech/glide/ListPreloader.java
浏览文件 @
5ebcfbd3
...
...
@@ -14,7 +14,7 @@ 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/>
* <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.
...
...
@@ -25,7 +25,7 @@ import java.util.Queue;
public
class
ListPreloader
<
T
>
implements
AbsListView
.
OnScrollListener
{
private
final
int
maxPreload
;
pr
ivate
final
PreloadTargetQueue
preloadTargetQueue
;
pr
otected
final
PreloadTargetQueue
preloadTargetQueue
;
private
final
PreloadModelProvider
<
T
>
preloadModelProvider
;
private
final
PreloadSizeProvider
<
T
>
preloadDimensionProvider
;
...
...
@@ -38,6 +38,7 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
/**
* 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
>
{
...
...
@@ -45,22 +46,19 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
/**
* Returns a non null list of all models that need to be loaded for the list to display adapter items in
* positions between {@code start} and {@code end}.
*
*
<p/>
* <p>
* A list of any size can be returned so there can be multiple models per adapter position.
* </p>
*
* @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}
* @param position The adapter position.
*/
List
<
U
>
getPreloadItems
(
int
start
,
int
end
);
List
<
U
>
getPreloadItems
(
int
position
);
/**
* Returns a non null {@link com.bumptech.glide.GenericRequestBuilder} for a given item. Must exactly match
* the request used to load the resource in the list.
*
*
<p/>
* <p>
* The target and context will be provided by the preloader.
* </p>
...
...
@@ -81,40 +79,60 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
/**
* Returns the size of the view in the list where the resources will be displayed in pixels in the format
* [x, y], or {@code null} if no size is currently available.
*
*
<p/>
* <p>
* Note - The dimensions returned here must precisely match those of the view in the list.
* </p>
*
* @param item A model
*/
int
[]
getPreloadSize
(
T
item
);
int
[]
getPreloadSize
(
T
item
,
int
adapterPosition
,
int
perItemPosition
);
}
/**
* Constructor for {@link com.bumptech.glide.ListPreloader} that requires users to subclass and override
* the {@link #getItems(int, int)} and {@link #getRequestBuilder(Object)} methods.
*
* @param maxPreload Maximum number of items to preload.
* @deprecated Use {@link #ListPreloader(com.bumptech.glide.ListPreloader.PreloadModelProvider,
* com.bumptech.glide.ListPreloader.PreloadSizeProvider, int)} instead. This constructor will be removed in Glide
* 4.0.
* @param maxPreload Maximum number of items to preload.
*/
@Deprecated
public
ListPreloader
(
int
maxPreload
)
{
this
(
null
,
null
,
maxPreload
);
this
.
preloadModelProvider
=
new
PreloadModelProvider
<
T
>()
{
@Override
public
List
<
T
>
getPreloadItems
(
int
position
)
{
return
getItems
(
position
,
position
+
1
);
}
@Override
public
GenericRequestBuilder
getPreloadRequestBuilder
(
T
item
)
{
return
getRequestBuilder
(
item
);
}
};
this
.
preloadDimensionProvider
=
new
PreloadSizeProvider
<
T
>()
{
@Override
public
int
[]
getPreloadSize
(
T
item
,
int
adapterPosition
,
int
perItemPosition
)
{
return
getDimensions
(
item
);
}
};
this
.
maxPreload
=
maxPreload
;
preloadTargetQueue
=
new
PreloadTargetQueue
(
maxPreload
+
1
);
}
/**
* Constructor for {@link com.bumptech.glide.ListPreloader} that accepts interfaces for providing the dimensions of
* images to preload, the list of models to preload for a given position, and the request to use to load images.
*
* @param preloadModelProvider Provides models to load and requests capable of loading them.
* @param preloadModelProvider
Provides models to load and requests capable of loading them.
* @param preloadDimensionProvider Provides the dimensions of images to load.
* @param maxPreload Maximum number of items to preload.
* @param maxPreload
Maximum number of items to preload.
*/
public
ListPreloader
(
PreloadModelProvider
<
T
>
preloadModelProvider
,
PreloadSizeProvider
<
T
>
preloadDimensionProvider
,
int
maxPreload
)
{
PreloadSizeProvider
<
T
>
preloadDimensionProvider
,
int
maxPreload
)
{
this
.
preloadModelProvider
=
preloadModelProvider
;
this
.
preloadDimensionProvider
=
preloadDimensionProvider
;
this
.
maxPreload
=
maxPreload
;
...
...
@@ -128,7 +146,7 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
@Override
public
void
onScroll
(
AbsListView
absListView
,
int
firstVisible
,
int
visibleCount
,
int
totalCount
)
{
int
totalCount
)
{
totalItemCount
=
totalCount
;
if
(
firstVisible
>
lastFirstVisible
)
{
preload
(
firstVisible
+
visibleCount
,
true
);
...
...
@@ -140,67 +158,59 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
/**
* Returns the size of the view in the list where the resources will be displayed.
*
*
<p/>
* <p>
* Note - The size returned here must precisely match those of the view in the list.
* </p>
*
* @deprecated Use {@link com.bumptech.glide.ListPreloader.PreloadSizeProvider} instead. This method will be removed
* in Glide 4.0.
* @param item A model
* @return The size of the view where the item will be displayed
* @deprecated Use {@link com.bumptech.glide.ListPreloader.PreloadSizeProvider} instead. This method will be removed
* in Glide 4.0.
*/
@Deprecated
protected
int
[]
getDimensions
(
T
item
)
{
if
(
preloadDimensionProvider
==
null
)
{
throw
new
IllegalStateException
(
"You must either provide a PreloadDimensionProvider or override getSize9)"
);
}
return
this
.
preloadDimensionProvider
.
getPreloadSize
(
item
);
throw
new
IllegalStateException
(
"You must either provide a PreloadDimensionProvider or override "
+
"getDimensions()"
);
}
/**
* Returns a non null list of all models that need to be loaded for the list to display adapter items
* between {@code start} and {@code end}.
*
*
<p/>
* <p>
* A list of any size can be returned so there can be multiple models per adapter position.
* </p>
*
* @deprecated Use {@link com.bumptech.glide.ListPreloader.PreloadModelProvider} instead. This method will be
* removed in Glide 4.0.
* @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}
* @deprecated Use {@link com.bumptech.glide.ListPreloader.PreloadModelProvider} instead. This method will be
* removed in Glide 4.0.
*/
@Deprecated
protected
List
<
T
>
getItems
(
int
start
,
int
end
)
{
if
(
preloadModelProvider
==
null
)
{
throw
new
IllegalStateException
(
"You must either provide a PreloadModelProvider or override getItems()"
);
}
return
this
.
preloadModelProvider
.
getPreloadItems
(
start
,
end
);
throw
new
IllegalStateException
(
"You must either provide a PreloadModelProvider or override getItems()"
);
}
/**
* Returns a non null {@link com.bumptech.glide.GenericRequestBuilder} for a given item. Must exactly match the
* request used to load the resource in the list.
*
*
<p/>
* <p>
* The target and context will be provided by the preloader.
* </p>
*
* @param item The model to load.
* @deprecated Use {@link com.bumptech.glide.ListPreloader.PreloadModelProvider} instead. This method will be
* removed in Glide 4.0.
* @param item The model to load.
*/
@SuppressWarnings
(
"rawtypes"
)
@Deprecated
protected
GenericRequestBuilder
getRequestBuilder
(
T
item
)
{
if
(
preloadModelProvider
==
null
)
{
throw
new
IllegalStateException
(
"You must either provide a PreloadModelProvider, or override "
+
"getRequestBuilder()"
);
}
return
this
.
preloadModelProvider
.
getPreloadRequestBuilder
(
item
);
throw
new
IllegalStateException
(
"You must either provide a PreloadModelProvider, or override "
+
"getRequestBuilder()"
);
}
private
void
preload
(
int
start
,
boolean
increasing
)
{
...
...
@@ -223,18 +233,18 @@ 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
);
//
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
);
//
final int numItems = items.size();
for
(
int
i
=
start
;
i
<
end
;
i
++)
{
preloadItem
(
this
.
preloadModelProvider
.
getPreloadItems
(
i
),
i
,
true
);
}
}
else
{
// Decreasing
for
(
int
i
=
items
.
size
()
-
1
;
i
>=
0
;
i
--)
{
preloadItem
(
items
,
i
);
for
(
int
i
=
end
-
1
;
i
>=
start
;
i
--)
{
preloadItem
(
this
.
preloadModelProvider
.
getPreloadItems
(
i
),
i
,
false
);
}
}
...
...
@@ -242,12 +252,25 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
lastEnd
=
end
;
}
private
void
preloadItem
(
List
<
T
>
items
,
int
position
,
boolean
isIncreasing
)
{
final
int
numItems
=
items
.
size
();
if
(
isIncreasing
)
{
for
(
int
i
=
0
;
i
<
numItems
;
++
i
)
{
preloadItem
(
items
.
get
(
i
),
position
,
i
);
}
}
else
{
for
(
int
i
=
numItems
-
1
;
i
>=
0
;
--
i
)
{
preloadItem
(
items
.
get
(
i
),
position
,
i
);
}
}
}
@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
,
int
i
)
{
final
int
[]
dimensions
=
this
.
preloadDimensionProvider
.
getPreloadSize
(
item
,
position
,
i
);
if
(
dimensions
!=
null
)
{
getRequestBuilder
(
item
).
into
(
preloadTargetQueue
.
next
(
dimensions
[
0
],
dimensions
[
1
]));
GenericRequestBuilder
preloadRequestBuilder
=
this
.
preloadModelProvider
.
getPreloadRequestBuilder
(
item
);
preloadRequestBuilder
.
into
(
preloadTargetQueue
.
next
(
dimensions
[
0
],
dimensions
[
1
]));
}
}
...
...
@@ -257,7 +280,7 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
}
}
pr
ivate
static
final
class
PreloadTargetQueue
{
pr
otected
static
final
class
PreloadTargetQueue
{
private
final
Queue
<
PreloadTarget
>
queue
;
public
PreloadTargetQueue
(
int
size
)
{
...
...
@@ -283,7 +306,7 @@ public class ListPreloader<T> implements AbsListView.OnScrollListener {
@Override
public
void
onResourceReady
(
Object
resource
,
GlideAnimation
<?
super
Object
>
glideAnimation
)
{
GlideAnimation
<?
super
Object
>
glideAnimation
)
{
// Do nothing.
}
...
...
library/src/main/java/com/bumptech/glide/util/FixedPreloadSizeProvider.java
浏览文件 @
5ebcfbd3
...
...
@@ -24,7 +24,7 @@ public class FixedPreloadSizeProvider<T> implements ListPreloader.PreloadSizePro
}
@Override
public
int
[]
getPreloadSize
(
T
item
)
{
public
int
[]
getPreloadSize
(
T
item
,
int
adapterPosition
,
int
itemPosition
)
{
return
Arrays
.
copyOf
(
this
.
size
,
this
.
size
.
length
);
}
}
library/src/main/java/com/bumptech/glide/util/ViewPreloadSizeProvider.java
浏览文件 @
5ebcfbd3
...
...
@@ -38,7 +38,7 @@ public class ViewPreloadSizeProvider<T> implements ListPreloader.PreloadSizeProv
}
@Override
public
int
[]
getPreloadSize
(
T
item
)
{
public
int
[]
getPreloadSize
(
T
item
,
int
adapterPosition
,
int
itemPosition
)
{
if
(
size
==
null
)
{
return
null
;
}
else
{
...
...
samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java
浏览文件 @
5ebcfbd3
...
...
@@ -171,8 +171,8 @@ public class FlickrPhotoGrid extends Fragment implements PhotoViewer {
}
@Override
public
List
<
Photo
>
getPreloadItems
(
int
start
,
int
end
)
{
return
photos
.
subList
(
start
,
end
);
public
List
<
Photo
>
getPreloadItems
(
int
position
)
{
return
photos
.
subList
(
position
,
position
+
1
);
}
@Override
...
...
samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoList.java
浏览文件 @
5ebcfbd3
...
...
@@ -168,8 +168,8 @@ public class FlickrPhotoList extends Fragment implements PhotoViewer {
}
@Override
public
List
<
Photo
>
getPreloadItems
(
int
start
,
int
end
)
{
return
photos
.
subList
(
start
,
end
);
public
List
<
Photo
>
getPreloadItems
(
int
position
)
{
return
photos
.
subList
(
position
,
position
+
1
);
}
@Override
...
...
samples/giphy/src/main/java/com/bumptech/glide/samples/giphy/MainActivity.java
浏览文件 @
5ebcfbd3
...
...
@@ -91,7 +91,7 @@ public class MainActivity extends Activity implements Api.Monitor {
private
Api
.
GifResult
[]
results
=
EMPTY_RESULTS
;
public
GifAdapter
(
Activity
activity
,
DrawableRequestBuilder
<
Api
.
GifResult
>
requestBuilder
,
ViewPreloadSizeProvider
<
Api
.
GifResult
>
preloadSizeProvider
)
{
ViewPreloadSizeProvider
<
Api
.
GifResult
>
preloadSizeProvider
)
{
this
.
activity
=
activity
;
this
.
requestBuilder
=
requestBuilder
;
this
.
preloadSizeProvider
=
preloadSizeProvider
;
...
...
@@ -155,11 +155,9 @@ public class MainActivity extends Activity implements Api.Monitor {
}
@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
));
}
public
List
<
Api
.
GifResult
>
getPreloadItems
(
int
position
)
{
List
<
Api
.
GifResult
>
items
=
new
ArrayList
<
Api
.
GifResult
>(
1
);
items
.
add
(
getItem
(
position
));
return
items
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录