Detect when RecyclerView reaches the bottom most position while scrolling

后端 未结 11 1880
没有蜡笔的小新
没有蜡笔的小新 2020-11-29 19:56

I have this code for a RecyclerView.

    recyclerView = (RecyclerView)rootview.findViewById(R.id.fabric_recyclerView);
    recyclerView.setLayoutManager(layo         


        
11条回答
  •  南笙
    南笙 (楼主)
    2020-11-29 20:41

    There is my implementation, it is very useful for StaggeredGridLayout.

    Usage :

    private EndlessScrollListener scrollListener =
            new EndlessScrollListener(new EndlessScrollListener.RefreshList() {
                @Override public void onRefresh(int pageNumber) {
                    //end of the list
                }
            });
    
    rvMain.addOnScrollListener(scrollListener);
    

    Listener implementation :

    class EndlessScrollListener extends RecyclerView.OnScrollListener {
    private boolean isLoading;
    private boolean hasMorePages;
    private int pageNumber = 0;
    private RefreshList refreshList;
    private boolean isRefreshing;
    private int pastVisibleItems;
    
    EndlessScrollListener(RefreshList refreshList) {
        this.isLoading = false;
        this.hasMorePages = true;
        this.refreshList = refreshList;
    }
    
    @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        StaggeredGridLayoutManager manager =
                (StaggeredGridLayoutManager) recyclerView.getLayoutManager();
    
        int visibleItemCount = manager.getChildCount();
        int totalItemCount = manager.getItemCount();
        int[] firstVisibleItems = manager.findFirstVisibleItemPositions(null);
        if (firstVisibleItems != null && firstVisibleItems.length > 0) {
            pastVisibleItems = firstVisibleItems[0];
        }
    
        if (visibleItemCount + pastVisibleItems >= totalItemCount && !isLoading) {
            isLoading = true;
            if (hasMorePages && !isRefreshing) {
                isRefreshing = true;
                new Handler().postDelayed(new Runnable() {
                    @Override public void run() {
                        refreshList.onRefresh(pageNumber);
                    }
                }, 200);
            }
        } else {
            isLoading = false;
        }
    }
    
    public void noMorePages() {
        this.hasMorePages = false;
    }
    
    void notifyMorePages() {
        isRefreshing = false;
        pageNumber = pageNumber + 1;
    }
    
    interface RefreshList {
        void onRefresh(int pageNumber);
    }  }
    

提交回复
热议问题