RecyclerView加载更多数据的三种不同的实现方式

2022-07-28 09:17:43

上拉加载更多数据通过监听RecyclerView的滚动事件RecyclerView.OnScrollListener()实现的,它提供了两个方法:

/**
         * 当RecyclerView的滑动状态改变时触发
         */publicvoidonScrollStateChanged(RecyclerView recyclerView,int newState){}/**
         * 当RecyclerView滑动时触发
         * 类似点击事件的MotionEvent.ACTION_MOVE
         */publicvoidonScrolled(RecyclerView recyclerView,int dx,int dy){}

RecyclerView的滑动状态有如下三种:

/**
     * The RecyclerView is not currently scrolling.
     * 手指离开屏幕
     */publicstaticfinalint SCROLL_STATE_IDLE =0;/**
     * The RecyclerView is currently being dragged by outside input such as user touch input.
     * 手指触摸屏幕
     */publicstaticfinalint SCROLL_STATE_DRAGGING =1;/**
     * The RecyclerView is currently animating to a final position while not under
     * outside control.
     * 手指加速滑动并放开,此时滑动状态伴随SCROLL_STATE_IDLE
     */publicstaticfinalint SCROLL_STATE_SETTLING =2;

第一种实现:滑动到最后一个item时自动触发的
与手指是否在屏幕上无关,即与滑动状态无关。因此,实现这种效果只需要在public void onScrolled(RecyclerView recyclerView, int dx, int dy) 方法中操作,无需关注当时的滑动状态:

@OverridepublicvoidonScrolled(RecyclerView recyclerView,int dx,int dy) {super.onScrolled(recyclerView, dx, dy);
                Log.d("test","onScrolled");int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();if (lastVisibleItemPosition +1 == adapter.getItemCount()) {
                    Log.d("test","loading executed");boolean isRefreshing = swipeRefreshLayout.isRefreshing();if (isRefreshing) {
                        adapter.notifyItemRemoved(adapter.getItemCount());return;
                    }if (!isLoading) {
                        isLoading =true;
                        handler.postDelayed(new Runnable() {@Overridepublicvoidrun() {
                                getData();
                                Log.d("test","load more completed");
                                isLoading =false;
                            }
                        },1000);
                    }
                }
            }

第二种实现:当且仅当滑动到最后一项并且手指上拉时才执行上拉加载更多
需要配合onScrollStateChanged(RecyclerView recyclerView, int newState的使用,可以将代码改为:

@OverridepublicvoidonScrollStateChanged(RecyclerView recyclerView,int newState) {super.onScrollStateChanged(recyclerView, newState);
                Log.d("test","StateChanged = " + newState);if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItemPosition +1 == adapter.getItemCount()) {
                    Log.d("test","loading executed");boolean isRefreshing = swipeRefreshLayout.isRefreshing();if (isRefreshing) {
                        adapter.notifyItemRemoved(adapter.getItemCount());return;
                    }if (!isLoading) {
                        isLoading =true;
                        handler.postDelayed(new Runnable() {@Overridepublicvoidrun() {
                                getData();
                                Log.d("test","load more completed");
                                isLoading =false;
                            }
                        },1000);
                    }
                }
            }@OverridepublicvoidonScrolled(RecyclerView recyclerView,int dx,int dy) {super.onScrolled(recyclerView, dx, dy);
                Log.d("test","onScrolled");

                lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();

            }

第三种是:每次滚动到最后一项都触发的加载更多:

@OverridepublicvoidonScrollStateChanged(RecyclerView recyclerView,int newState) {super.onScrollStateChanged(recyclerView, newState);int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();if (lastVisibleItemPosition +1 == adapter.getItemCount()) {
                    Log.d("test","loading executed");boolean isRefreshing = swipeRefreshLayout.isRefreshing();if (isRefreshing) {
                        adapter.notifyItemRemoved(adapter.getItemCount());return;
                    }if (!isLoading) {
                        isLoading =true;
                        handler.postDelayed(new Runnable() {@Overridepublicvoidrun() {
                                getData();
                                Log.d("test","load more completed");
                                isLoading =false;
                            }
                        },1000);
                    }
                }
            }

参考: 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多

  • 作者:afunyusong
  • 原文链接:https://blog.csdn.net/afanyusong/article/details/51296290
    更新时间:2022-07-28 09:17:43