列表分页和下拉刷新是列表页的经常使用功能。在Android开发中,列表通常用ListView或RecyclerView实现。android
RecyclerView比ListView用起来更加的顺手,可是不管是RecyclerView仍是ListView都没有列表分页和下拉刷新功能。此次就已RecyclerView为例,使用尽可能少的代码,让RecyclerView带有下拉和底部上拉的监听。ide
我使用的是kotlin 扩展函数。函数
此次没有效果图。 布局
直接撸代码:ui
<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>
复制代码
interface RecyclerListener {
fun loadMore()
fun refresh()
}
复制代码
//在布局中,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()
}
}
}
复制代码
recyclerView.setListener(object :RecyclerListener{
override fun loadMore() {
}
override fun refresh() {
}
})
复制代码
总结,下拉刷新的触发是由swipeRefreshLayout 监听的,上拉是监听RecyclerView滚动到底部触发的。是kotlin 的扩展函数能够很方便的在不破坏原有代码结构的前提下扩展功能。this