列表分頁和下拉刷新是列表頁的經常使用功能。在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