How to put RecyclerView inside NestedScrollView?

后端 未结 4 1530
南方客
南方客 2020-11-30 18:30

With creation of NestedScrollView you can put scrolling view inside another scrolling view as long as those implement NestedScrollingChild and NestedScrollingParent correctl

4条回答
  •  抹茶落季
    2020-11-30 18:52

    Here is solution to call server only when you are realy need to load more data. In this way you can put your endless RecyclerView and many other views inside NestedScrollView. For me it is working well.

    1. Create EndlessParentScrollListener class to handle scroll events from NestedSrollView.

    public abstract class EndlessParentScrollListener implements NestedScrollView.OnScrollChangeListener {
            // The current offset index of data you have loaded
            private int currentPage = 0;
            // The total number of items in the dataset after the last load
            private int previousTotalItemCount = 0;
            // True if we are still waiting for the last set of data to load.
            private boolean loading = true;
            // Sets the starting page index
            private int startingPageIndex = 0;
            // The minimum amount of pixels to have below your current scroll position
            // before loading more.
            private int visibleThresholdDistance = 300;
    
            RecyclerView.LayoutManager mLayoutManager;
    
            public EndlessParentScrollListener(RecyclerView.LayoutManager layoutManager) {
                this.mLayoutManager = layoutManager;
            }
    
            @Override
            public void onScrollChange(NestedScrollView scrollView, int x, int y, int oldx, int oldy) {
                // We take the last son in the scrollview
                View view = scrollView.getChildAt(scrollView.getChildCount() - 1);
                int distanceToEnd = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));
    
                int totalItemCount = mLayoutManager.getItemCount();
                // If the total item count is zero and the previous isn't, assume the
                // list is invalidated and should be reset back to initial state
                if (totalItemCount < previousTotalItemCount) {
                    this.currentPage = this.startingPageIndex;
                    this.previousTotalItemCount = totalItemCount;
                    if (totalItemCount == 0) {
                        this.loading = true;
                    }
                }
    
                // If it’s still loading, we check to see if the dataset count has
                // changed, if so we conclude it has finished loading and update the current page
                // number and total item count.
                if (loading && (totalItemCount > previousTotalItemCount)) {
                    loading = false;
                    previousTotalItemCount = totalItemCount;
                }
    
                // If it isn’t currently loading, we check to see if we have breached
                // the visibleThreshold and need to reload more data.
                // If we do need to reload some more data, we execute onLoadMore to fetch the data.
                // threshold should reflect how many total columns there are too
                if (!loading && distanceToEnd <= visibleThresholdDistance) {
                    currentPage++;
                    onLoadMore(currentPage, totalItemCount);
                    loading = true;
                }
            }
    
            // Defines the process for actually loading more data based on page
            public abstract void onLoadMore(int page, int totalItemsCount);
        }
    

    2. Set listener

    private void initRecycler() {  
            //TODO init recycler adapter here
    
            recycler.setNestedScrollingEnabled(false);          
            LinearLayoutManager _layoutManager = new LinearLayoutManager(this);
            recycler.setLayoutManager(_layoutManager);
            NestedScrollView scrollView = (NestedScrollView) findViewById(R.id.scrollView);
            scrollView.setOnScrollChangeListener(new EndlessParentScrollListener(_layoutManager) {
                    @Override
                    public void onLoadMore(int page, int totalItemsCount) {                     
                        if (loadedItemCount < serverItemsCount)
                            customLoadMoreDataFromApi();
                    }
                });
            customLoadMoreDataFromApi();
        }
    

    Short xml if someone find it usefull:

    
    
    
            
                ...
            
    
            
    
                
    
                    
    
                    
    
                    
    
                
            
    
        
    

提交回复
热议问题