BETA

RecyclerViewにページングの処理をセットする

投稿日:2019-12-10
最終更新:2019-12-10
class fragment: Fragment() {  

private var scrollListener: InfiniteScrollListener? = null  

    private fun setRecyclerView() {  
        binding?.apply {  
            recyclerList.apply {  
                setHasFixedSize(true)  
                val linearLayoutManager = LinearLayoutManager(activity)  
                this.layoutManager = linearLayoutManager  
                adapter = viewAdapter  
                scrollListener = InfiniteScrollListener(linearLayoutManager) {  
                    // 次ページのデータを取得する  
                }  
                scrollListener?.let {  
                    addOnScrollListener(it)  
                }  
            }  
            swipeRefresh.setOnRefreshListener {  
                // スワイプリフレッシュしたときの処理  
            }  
        }  
    }  
}  

class InfiniteScrollListener(  
        val layoutManager: LinearLayoutManager,  
        private val visibleThreshold: Int = 1,  
        val func: () -> Unit) : RecyclerView.OnScrollListener() {  

    private var previousTotal = 0  
    private var loading = true  
    private var firstVisibleItem = 0  
    private var visibleItemCount = 0  
    private var totalItemCount = 0  

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {  
        super.onScrolled(recyclerView, dx, dy)  

        if (dy > 0) {  
            visibleItemCount = recyclerView.childCount  
            totalItemCount = layoutManager.itemCount  
            firstVisibleItem = layoutManager.findFirstVisibleItemPosition()  

            if (loading) {  
                if (totalItemCount > previousTotal) {  
                    loading = false  
                    previousTotal = totalItemCount  
                }  
            }  
            if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {  
                func()  
                loading = true  
            }  
        }  
    }  

 // API通信がエラーになったときに呼ぶ  
    fun reset() {   
        previousTotal = 0  
        loading = true  
        firstVisibleItem = 0  
        visibleItemCount = 0  
        totalItemCount = 0  
    }  
}  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@tantanの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう