给RecyclerView扩展下拉刷新上拉加载

4,010 阅读2分钟

列表分页和下拉刷新是列表页的常用功能。在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 的扩展函数可以很方便的在不破坏原有代码结构的前提下扩展功能。