【问题标题】:RecyclerView not calling onScrolled at the bottomRecyclerView 没有在底部调用 onScrolled
【发布时间】:2017-09-12 17:31:32
【问题描述】:

我正在尝试创建一个带有分页的RecyclerView,当我尝试向下滚动时,我在显示进度条时遇到了问题,并且已经位于列表的最后。有一个回调 RecyclerView.OnScrollListener 有一个方法 onScrolled 用于处理滚动事件,但是当没有发生实际滚动时它不起作用。

当我尝试从底部向下滚动时,onScrollStateChanged 方法有效,但我的逻辑要求我知道手势的方向(上/下),所以这种方法对我的情况没有帮助。

我目前正在尝试这样做(这显然行不通):

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            fetchDataFromServer();
        }
    });

编辑:我试图检测onScrolled 中是否达到了结尾,它有点工作,但有时当我尝试从服务器获取数据时我没有收到任何东西,所以在这样的请求之后我仍然在列表的末尾,我想向下滚动以尝试再次更新列表,但我不能,因为 onScrolled 没有被调用。

关于如何解决这个问题的任何想法?我可以使用其他回调吗?

【问题讨论】:

  • 查看您的源代码摘录并猜测您正在尝试在 RecyclerView 上实现分页,不是吗?如果是这样,那么当RecyclerView.Adapter 将数据绑定到最后一个视图时,为什么不尝试在onBindViewHolder 方法中调用fetchDataFromServer()
  • 是的,这就是我正在做的,我会试试你的解决方案,谢谢
  • 这里提到了onScrolled 问题的替代解决方案:link

标签: java android android-recyclerview


【解决方案1】:

我猜想在recyclerview 的末尾显示进度,您只需要确保已到达终点即可。

事情就是这样——

private int visibleThreshold = 1; // trigger just one item before the end
private int lastVisibleItem, totalItemCount;

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                totalItemCount = mLayoutManager.getItemCount();
                lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();

                if (totalItemCount <= (lastVisibleItem + visibleThreshold) {
                    // ... end has been reached...
                    //... do your stuff over here...
                }
            }
        });
    }

编辑:

有时当我尝试从我没有收到的服务器获取数据时 任何东西

简单!如果您的网络请求失败,请尝试捕获异常。如果是SocketTimeOutException再次尝试执行相同的请求。如果还有其他异常(可能来自后端或前端),请修复它。

【讨论】:

    【解决方案2】:

    检查您的回收器视图是否嵌套在 NestedScrollView 或其他东西中... 删除嵌套的滚动视图,它将起作用。 只需使用回收站视图并使用回收站视图的 VIEW_TYPE 概念即可实现任何类型的提要

    【讨论】:

    • 这个问题有点太老了)不过还是谢谢你
    【解决方案3】:

    如果你为 min sdk level 23 开发,那么你可以使用 setOnScrollChangeListener

      recyclerView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    
            }
        });
    

    【讨论】:

    • 谢谢,但我不是,最低 sdk 级别是 19
    猜你喜欢
    • 2020-08-03
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多