給RecyclerView擴充套件下拉重新整理上拉載入

我是綠色大米呀發表於2018-03-30

列表分頁和下拉重新整理是列表頁的常用功能。在Android開發中,列表一般用ListView或RecyclerView實現。

RecyclerView比ListView用起來更加的順手,但是無論是RecyclerView還是ListView都沒有列表分頁和下拉重新整理功能。這次就已RecyclerView為例,使用盡量少的程式碼,讓RecyclerView帶有下拉和底部上拉的監聽。

我使用的是kotlin 擴充套件函式。

這次沒有效果圖。

O(∩_∩)O~

直接擼程式碼:

    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 的擴充套件函式可以很方便的在不破壞原有程式碼結構的前提下擴充套件功能。

相關文章