給RecyclerView擴展下拉刷新上拉加載

列表分頁和下拉刷新是列表頁的經常使用功能。在Android開發中,列表通常用ListView或RecyclerView實現。android

RecyclerView比ListView用起來更加的順手,可是不管是RecyclerView仍是ListView都沒有列表分頁和下拉刷新功能。此次就已RecyclerView爲例,使用盡可能少的代碼,讓RecyclerView帶有下拉和底部上拉的監聽。ide

我使用的是kotlin 擴展函數。函數

此次沒有效果圖。 佈局

O(∩_∩)O~

直接擼代碼:ui

    1. 首先,要用到的下拉效果就須要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 的擴展函數能夠很方便的在不破壞原有代碼結構的前提下擴展功能。this

相關文章
相關標籤/搜索