package com.yidianling.tests.home.widget import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.GridLayoutManager import android.widget.AbsListView.OnScrollListener.SCROLL_STATE_IDLE import com.yidianling.tests.home.adapter.AdapterWrapper import com.yidianling.tests.home.config.ITestHomeConfig /** * @author yuanwai * @描述:上拉加载更多帮助类 * @Copyright Copyright (c) 2018 * @Company 壹点灵 * @date 2018/7/26 */ class SwipeToLoadHelper(recyclerView: RecyclerView, private val mAdapterWrapper: AdapterWrapper) : RecyclerView.OnScrollListener() ,AdapterWrapper.FooterCallBack{ private val mRecyclerView: RecyclerView? = null private val mLayoutManager: RecyclerView.LayoutManager = recyclerView.layoutManager!! private var mListener: LoadMoreListener? = null /** 是否正在加载中 */ private var mLoading = false /** 上拉刷新功能是否开启 */ private var mIsSwipeToLoadEnabled = true init { if (mLayoutManager is GridLayoutManager) { mAdapterWrapper.setAdapterType(AdapterWrapper.ADAPTER_TYPE_GRID) mAdapterWrapper.setSpanCount(mLayoutManager.spanCount) } else if (mLayoutManager is LinearLayoutManager) { mAdapterWrapper.setAdapterType(AdapterWrapper.ADAPTER_TYPE_LINEAR) } mAdapterWrapper.setFooterCallBack(this) // 将OnScrollListener设置RecyclerView recyclerView.addOnScrollListener(this) } override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { if (mIsSwipeToLoadEnabled && SCROLL_STATE_IDLE === newState && !mLoading) { if (mLayoutManager is GridLayoutManager) { val gridLayoutManager = mLayoutManager gridLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return if (mIsSwipeToLoadEnabled) { // 功能开启, 根据位置判断, 最后一个item时返回整个宽度, 其他位置返回1 // AdapterWrapper会保证最后一个item会从新的一行开始 if (position == mLayoutManager.getItemCount() - 1) { gridLayoutManager.spanCount } else { 1 } } else { 1 } } } } if (mLayoutManager is LinearLayoutManager) { val linearLayoutManager = mLayoutManager val lastCompletePosition = linearLayoutManager.findLastCompletelyVisibleItemPosition() // only when the complete visible item is second last if (lastCompletePosition == mLayoutManager.getItemCount() - 2) { val firstCompletePosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition() val child = linearLayoutManager.findViewByPosition(lastCompletePosition) ?: return val deltaY = recyclerView!!.bottom - recyclerView.paddingBottom - child.bottom if (deltaY > 0 && firstCompletePosition != 0) { recyclerView.smoothScrollBy(0, -deltaY) } } else if (lastCompletePosition == mLayoutManager.getItemCount() - 1) { // 最后一项完全显示, 触发操作, 执行加载更多操作 禁用回弹判断 mLoading = true mAdapterWrapper.setLoadItemState(ITestHomeConfig.STATUS_LOADING) if (mListener != null) { mListener!!.onLoad() } } } } } override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) } /** 设置下拉刷新功能是否开启 */ fun setSwipeToLoadEnabled(isSwipeToLoadEnabled: Boolean) { if (mIsSwipeToLoadEnabled != isSwipeToLoadEnabled) { mIsSwipeToLoadEnabled = isSwipeToLoadEnabled mAdapterWrapper.setLoadItemVisibility(isSwipeToLoadEnabled) } } /** 设置LoadMore Item为加载完成状态, 上拉加载更多完成时调用 */ fun setLoadMoreFinish() { mLoading = false mAdapterWrapper.setLoadItemState(ITestHomeConfig.STATUS_UP_LOAD) } /** * 设置LoadMore Item为没有更多数据状态 显示查看全部测评 */ fun setNoMoreData(){ mLoading = false mAdapterWrapper.setLoadItemState(ITestHomeConfig.STATUS_SELECT_ALL) } override fun selectAll() { mListener!!.selectAll() } /** 上拉操作触发时调用的接口 */ fun setLoadMoreListener(loadMoreListener: LoadMoreListener) { mListener = loadMoreListener } interface LoadMoreListener { /** * 加载更多 */ fun onLoad() /** * 查看全部测评 */ fun selectAll() } }