站长网 教程 分析RecyclerView下拉刷新与上拉更多

分析RecyclerView下拉刷新与上拉更多

副标题#e# 我将这个扩展的RecyclerView命名为EnhanceRecyclerView,继承RecyclerView。我们知道既然要实现下拉刷新与上拉更多自然先要实现头部与尾部的布局,所以我们先利用前面的知识来为EnhanceRecycleView添加header与footer publicvoidinitView(){ View

副标题#e#

我将这个扩展的RecyclerView命名为EnhanceRecyclerView,继承RecyclerView。我们知道既然要实现下拉刷新与上拉更多自然先要实现头部与尾部的布局,所以我们先利用前面的知识来为EnhanceRecycleView添加header与footer

public void initView() { 

        View headerView = LayoutInflater.from(getContext()).inflate(R.layout.head_layout, null); 

        View footerView = LayoutInflater.from(getContext()).inflate(R.layout.footer_layout, null); 

        addHeaderView(headerView); 

        addFooterView(footerView); 

    } 

其中的布局文件就不多说了,至于addHeaderView与addFooterView方法可以查看我前面的那篇文章,有详细的介绍

设置监听器

既然要实现下拉刷新与上拉加载,自然少不了对监听器的处理,所以下面来详细介绍下对监听器OnScrollListener与OnTouchListener的处理。

OnScrollListener

为EnhanceRecyclerView添加addOnScrollListener实现其中的onScrollStateChanged与onScrolled方法。

onScrolled

在onScrolled中我们主要做的是获取EnhanceRcyclerView中item的总数量、视图显示中的***个item在EnhanceRecyclerView中所处的位置与视图显示中***一个item在EnhanceRecyclerView中所处的位置。

对于item的总数量很好获取直接调用

totalCount = getLayoutManager().getItemCount(); 

由于RecyclerView能实现LinearLayoutManager、GridLayoutManager与StaggeredGridLayoutManager不同的布局,所以另外两个要根据不同的manager来获取,还是看具体代码吧

if (getLayoutManager() instanceof LinearLayoutManager) { 

                    lastItem = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition(); 

                    firstVisible = ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition(); 

                } else { 

                    into = ((StaggeredGridLayoutManager) getLayoutManager()).findLastVisibleItemPositions(into); 

                    firstInto = ((StaggeredGridLayoutManager) getLayoutManager()).findFirstVisibleItemPositions(firstInto); 

                    lastItem = into[0]; 

                    firstVisible = firstInto[0]; 

                } 

onScrollStateChanged

获取到了那三个关键数据以后,就可以在onScrollStateChanged中实现具体的逻辑,在这个方法中主要实现的是对上拉加载更多的处理

if (lastItem == adapter.getItemCount() + 1 && newState == RecyclerView.SCROLL_STATE_IDLE && !isLoad) { 

                    ViewGroup.LayoutParams params = getFooterView(0).getLayoutParams(); 

                    params.width = RecyclerView.LayoutParams.MATCH_PARENT; 

                    params.height = RecyclerView.LayoutParams.WRAP_CONTENT; 

                    getFooterView(0).setLayoutParams(params); 

#p#副标题#e#

                    getFooterView(0).setVisibility(View.VISIBLE); 

                    smoothScrollToPosition(totalCount); 

                    isLoad = true; 

                    loadMoreListener.onLoadMore(); 

                } 

                if (firstVisible == 0) { 

                    isTop = true; 

                } else { 

                    isTop = false; 

#p#副标题#e##p#分页标题#e#

                    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) getHeaderView(0).getLayoutParams(); 

                    params.width = RecyclerView.LayoutParams.MATCH_PARENT; 

                    params.height = RecyclerView.LayoutParams.WRAP_CONTENT; 

                    params.setMargins(0, -getHeaderView(0).getHeight(), 0, 0); 

                    getHeaderView(0).setLayoutParams(params); 

                } 

简单说明下,核心就是判断lastItem是否处在***的位置,如果是的话就继续加载更多的操作,这里提供了一个对数据处理的接口所以只要实现loadMoreListener.onLoadMore();即可。

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/video/2021/0529/7370.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部