为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取RecyclerView瀑布流样式下滑动到底的状态呢?

如何获取到瀑布流滑动到底的状态呢?应用场景是网络加载图片,滑动到底了,需要分页加载下一页的时候。

正在回答

3 回答

sorry,刚才直接在这块写的 忘记了判断是否是最后一个item,下面改正代码。

@Override
public void onScrollStateChanged(int state) {
    // 如果停止滑动
    if(state == SCROLL_STATE_IDLE){
        LayoutManager layoutManager = getLayoutManager();
        if(getLayoutManager() instanceof StaggeredGridLayoutManager){
            // 获取布局管理器
            StaggeredGridLayoutManager layout =
                    (StaggeredGridLayoutManager)layoutManager;
            // 用来记录lastItem的position
            // 由于瀑布流有多个列 所以此处用数组存储
            int column = layout.getColumnCountForAccessibility(null,null);
            int positions[] = new int[column];
            // 获取lastItem的positions
            layout.findLastVisibleItemPositions(positions);
            for(int i=0;i<positions.length ; i++){
                /**
                 * 判断lastItem的底边到recyclerView顶部的距离
                 * 是否小于recyclerView的高度
                 * 如果小于或等于 说明滚动到了底部
                 */
                // 刚才忘了写判断是否是最后一个item了
                if(positions[i] >= (layout.getItemCount()-column)
                        && layout.findViewByPosition(positions[i]).getBottom() <= getHeight()){
                    /**
                     * 此处实现你的业务逻辑
                     */
                    Log.e("到底了","true");
                    break;
                }

            }
        }else if(getLayoutManager() instanceof LinearLayoutManager){

            LinearLayoutManager layout =
                    (LinearLayoutManager) layoutManager;
            int position = layout.findLastVisibleItemPosition();
            // 刚才忘了写判断是否是最后一个item了
            if(position-1 == layout.getItemCount()
                    && layout.findViewByPosition(position).getBottom() <= getHeight()){
                Log.e("到底了","true");
            }

        }

    }
    super.onScrollStateChanged(state);
}
1 回复 有任何疑惑可以回复我~
#1

qq_信念_0

position都是+1 不是-1...
2016-01-14 回复 有任何疑惑可以回复我~

RecyclerView的OnScrollLinstener和listView不一样,没办法获取lastItemPostion。

但是它的LayouManager可以找到lastItem和FirstItem的position(注意:因为StaggeredGridLayoutManager
可能有多个列,所以StaggeredGridLayoutManager获取到的lastItem可能有多个)。

这里为了复用,我通过重写onScrollStateChanged自定义了RecyclerView实现,当然,你也使用监听器的方式实现,核心代码如下所示:

@Override
public void onScrollStateChanged(int state) {
    // 如果停止滑动
    if(state == SCROLL_STATE_IDLE){
        // 获取布局管理器
        StaggeredGridLayoutManager layout =
                (StaggeredGridLayoutManager) getLayoutManager();
        // 用来记录lastItem的position
        // 由于瀑布流有多个列 所以此处用数组存储
        int positions[] = new
                int[layout.getColumnCountForAccessibility(null,null)];
        // 获取lastItem的positions
        /**
         * 其他布局管理器可使用同样方式获取
         */
        layout.findLastVisibleItemPositions(positions);
        for(int i=0;i<positions.length ; i++){
            /**
             * 判断lastItem的底边到recyclerView顶部的距离
             * 是否小于recyclerView的高度
             * 如果小于或等于 说明滚动到了底部
             */
             
            if(layout.findViewByPosition(positions[i]).getBottom() <= getHeight()){
                /**
                 * 此处实现你的业务逻辑
                 */
                Log.e("到底了","true");
                return;
            }

        }

    }
    super.onScrollStateChanged(state);
}


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
明日之星-RecyclerView
  • 参与学习       40780    人
  • 解答问题       116    个

带领大家学习百变RecyclerView,绝对干货,告别加班不是梦

进入课程

如何获取RecyclerView瀑布流样式下滑动到底的状态呢?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信