[开源学习_MeiZhi]RecyclerView滚动到底部自动加载下一页

本文介绍了如何使用RecyclerView实现滚动到底部自动加载下一页的功能,参照了drakeet的MeiZhi开源项目。通过绑定监听器、实现监听器逻辑和理解API说明,可以实现无缝加载更多内容。

[开源学习_MeiZhi]RecyclerView滚动到底部自动加载下一页

源码片段来源: drakeet的MeiZhi 项目.
https://github.com/drakeet/Meizhi

绑定监听器

final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,
        StaggeredGridLayoutManager.VERTICAL); //瀑布流布局管理器
mRecyclerView.setLayoutManager(layoutManager);
mMeizhiListAdapter = new MeizhiListAdapter(this, mMeizhiList);
mRecyclerView.setAdapter(mMeizhiListAdapter);
mRecyclerView.addOnScrollListener(getOnBottomListener(layoutManager)); //添加滚动监听

监听器的实现

//滚动到底部自动加载下一页
RecyclerView.OnScrollListener getOnBottomListener(StaggeredGridLayoutManager layoutManager) {
    return new RecyclerView.OnScrollListener() {
        @Override public void onScrolled(RecyclerView rv, int dx, int dy) {
        //是否到达底部, 因为是2列,所以参数是new int[2], 判断第二列显示的View的数量是否显示完全
            boolean isBottom =layoutManager.findLastCompletelyVisibleItemPositions(new int[2])[1] >=
                            mMeizhiListAdapter.getItemCount() - PRELOAD_SIZE;
            if (!mSwipeRefreshLayout.isRefreshing() && isBottom) {
                if (!mIsFirstTimeTouchBottom) {
                    mSwipeRefreshLayout.setRefreshing(true); //显示刷新
                    mPage += 1; //加载下一页
                    loadData();
                } else {
                    mIsFirstTimeTouchBottom = false;
                }
            }
        }
    };
}

API说明

StaggeredGridLayoutManager#findLastCompletelyVisibleItemPositions()的API说明:
/**
  * Returns the adapter position of the last completely visible view for each span.
  * <p>  返回每一列可见的最后一个view的位置的数组
  * @param into An array to put the results into. If you don't provide any, LayoutManager will
  *             create a new one. 用来存放结果的数组into[]
  * @return The adapter position of the last fully visible item in each span. If a span does not
  * have any items, {@link RecyclerView#NO_POSITION} is returned for that span.
  */
 public int[] findLastCompletelyVisibleItemPositions(int[] into) {
     if (into == null) {
         into = new int[mSpanCount]; //根据设置的spanCount来创建数组
     } else if (into.length < mSpanCount) {
         throw new IllegalArgumentException("Provided int[]'s size must be more than or equal"
                 + " to span count. Expected:" + mSpanCount + ", array size:" + into.length);
     }
     for (int i = 0; i < mSpanCount; i++) {
         into[i] = mSpans[i].findLastCompletelyVisibleItemPosition(); //每个span都是找到最后一个位置
     }
     return into;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值