RecyclerView是 Android 兼容包V21中新推出的列表类,它的自定义化强的优点足以让它能够取代GridView和ListView,本文将结合SwipeRefreshLayout与RecyclerView讲解如何实现下拉刷新和自动加载的代码
需要的依赖
以下版本自行更新
1
2
3
4
|
compile
'com.android.support:appcompat-v7:21.0.0'
compile
'com.android.support:recyclerview-v7:21.0.0'
compile
'com.android.support:cardview-v7:21.0.0'
compile
'com.android.support:support-v4:21.0.0'
|
需要解决的问题
- [x] 下拉刷新
- [x] 自动加载
- [x] 网络请求异步加载
技术处理
下拉刷新
采用 android.support.v4.widget.SwipeRefreshLayout
来实现
具体可以搜索这个class,我们按照官方文档,布局如下
1
2
3
4
5
6
7
8
9
10
11
12
|
<
view
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
android
:
id
=
"@+id/swipeRefreshLayout"
class
=
"android.support.v4.widget.SwipeRefreshLayout"
android
:
layout_width
=
"match_parent"
android
:
layout_height
=
"match_parent"
>
<
view
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
android
:
id
=
"@+id/recylerView"
class
=
"android.support.v7.widget.RecyclerView"
android
:
layout_width
=
"wrap_content"
android
:
layout_height
=
"wrap_content"
>
<
/
view
>
<
/
view
>
|
然后对 swipeRefreshLayout
设置监听即可
1
2
3
4
5
6
7
8
9
10
|
swipeRefreshLayout
.
setOnRefreshListener
(
new
SwipeRefreshLayout
.
OnRefreshListener
(
)
{
@Override
public
void
onRefresh
(
)
{
if
(
isrefreshing
)
{
Log
.
d
(
TAG
,
"ignore manually update!"
);
}
else
{
loadPage
(
)
;
}
}
}
)
;
|
自动加载
RecyclerView是一个新兴事物,伸手党们还找不到 endless-RecyclerView
这样的开源神器,只好自己找方法了,同ListView一样,还是重写 OnScrollListener
这个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
recyclerView
.
setOnScrollListener
(
new
RecyclerView
.
OnScrollListener
(
)
{
@Override
public
void
onScrolled
(
RecyclerView
recyclerView
,
int
dx
,
int
dy
)
{
super
.
onScrolled
(
recyclerView
,
dx
,
dy
)
;
int
lastVisibleItem
=
(
(
LinearLayoutManager
)
mLayoutManager
)
.
findLastVisibleItemPosition
(
)
;
int
totalItemCount
=
mLayoutManager
.
getItemCount
(
)
;
//lastVisibleItem >= totalItemCount - 4 表示剩下4个item自动加载,各位自由选择
// dy>0 表示向下滑动
if
(
lastVisibleItem
>=
totalItemCount
-
4
&&
dy
>
0
)
{
if
(
isLoadingMore
)
{
Log
.
d
(
TAG
,
"ignore manually update!"
)
;
}
else
{
loadPage
(
)
;
//这里多线程也要手动控制isLoadingMore
isLoadingMore
=
false
;
}
}
}
}
)
;
|
如果想用GridView,可以试试这个,注意例子里的span_count =2
1
2
3
4
5
6
7
8
9
10
11
12
|
@Override
public
void
onScrolled
(
RecyclerView
recyclerView
,
int
dx
,
int
dy
)
{
super
.
onScrolled
(
recyclerView
,
dx
,
dy
)
;
int
[
]
visibleItems
=
mLayoutManager
.
findLastVisibleItemPositions
(
null
)
;
int
lastitem
=
Math
.
max
(
visibleItems
[
0
]
,
visibleItems
[
1
]
)
;
Log
.
d
(
TAG
,
"visibleItems ="
+
visibleItems
)
;
Log
.
d
(
TAG
,
"lastitem ="
+
lastitem
)
;
Log
.
d
(
TAG
,
"adapter.getItemCount() ="
+
adapter
.
getItemCount
(
)
)
;
if
(
dy
>
0
&&
lastitem
>
adapter
.
getItemCount
(
)
-
5
&&
!
isLoadingMore
)
{
Log
.
d
(
TAG
,
"will loadNewFeeds"
)
;
}
}
|
网络请求异步加载
我这里的 loadPage
是基于 Retrofit 构建的,输入参数是一个Map,它的回调功能非常实用,可以直接控制UI更新,流程图如下,大家可以参考一下设计

loadPage 流程图
参考文献
问啊-一键呼叫程序员答题神器,牛人一对一服务,开发者编程必备官方网站:www.wenaaa.com
QQ群290551701 聚集很多互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!
QQ群290551701 聚集很多互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!