列表分页和下拉刷新是列表页的常用功能。在Android开发中,列表一般用ListView或RecyclerView实现。
RecyclerView比ListView用起来更加的顺手,但是无论是RecyclerView还是ListView都没有列表分页和下拉刷新功能。这次就已RecyclerView为例,使用尽量少的代码,让RecyclerView带有下拉和底部上拉的监听。
我使用的是kotlin 扩展函数。
这次没有效果图。
直接撸代码:
-
- 首先,要用到的下拉效果就需要Android自带的SwipeRefreshLayout,所以需要在布局文件RecyclerView的外面套一个SwipeRefreshLayout。(你可以把这个布局文件当成模版,在需要列表的页面直接include进来。)
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
复制代码
- 2.然后写个接口Listener
interface RecyclerListener {
fun loadMore()
fun refresh()
}
复制代码
- 3.接着是核心代码,给RecycleerView加上扩展,下面的代码可以放在项目中的任何kotlin文件中。
//在布局中,RecyclerView外嵌套一个swipeRefreshLayout,即可实现下拉刷新上拉加载更多
fun RecyclerView.setListener(l: RecyclerListener){
setOnScrollListener(object : RecyclerView.OnScrollListener() {
var lastVisibleItem: Int = 0
val swipeRefreshLayout = this@setListener.parent
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
lastVisibleItem = (recyclerView?.layoutManager as LinearLayoutManager).findLastVisibleItemPosition()
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 === recyclerView.adapter?.itemCount) {
//下拉刷新的时候不可以加载更多
if(swipeRefreshLayout is SwipeRefreshLayout){
if(!swipeRefreshLayout.isRefreshing){
l.loadMore()
}
}else{
l.loadMore()
}
}
}
})
val swipeRefreshLayout = this.parent
if(swipeRefreshLayout is SwipeRefreshLayout){
swipeRefreshLayout.setOnRefreshListener {
l.refresh()
}
}
}
复制代码
- 4.到此所有的准备工作就结束了。最后在整个项目中,需要下拉刷新的地方直接加上监听器即可
recyclerView.setListener(object :RecyclerListener{
override fun loadMore() {
}
override fun refresh() {
}
})
复制代码
总结,下拉刷新的触发是由swipeRefreshLayout 监听的,上拉是监听RecyclerView滚动到底部触发的。是kotlin 的扩展函数可以很方便的在不破坏原有代码结构的前提下扩展功能。