清除RecyclerView数据后setOnScrollListener失效问题求助
Hey there, let’s tackle this issue where your EndlessRecyclerOnScrollListener stops working after clearing RecyclerView data for a refresh. This is a common pitfall with endless scroll implementations, and it almost always boils down to unreset internal state in your scroll listener or inconsistent adapter handling. Here’s how to fix it step by step:
1. Reset the Scroll Listener’s Internal State
Most custom endless scroll listeners track state like current page number, loading status, or whether there’s more data to load. When you clear data and refresh, these values stay stuck in their old state (e.g., isLoading remains true, or current_page is stuck on page 3), so the listener never triggers new load events.
First, add a reset method to your EndlessRecyclerOnScrollListener class:
public class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { private int currentPage = 1; private boolean isLoading = false; private boolean hasMoreData = true; private final LinearLayoutManager layoutManager; // Your existing constructor and scroll logic... // Add this method to reset state for fresh loads public void resetScrollState() { currentPage = 1; isLoading = false; hasMoreData = true; // Reset any other state variables your listener uses } }
2. Call the Reset Method When Refreshing
When you trigger a refresh (via your SwipeRefreshLayout), make sure to reset the listener’s state before clearing data or loading new content:
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // Reset the scroll listener first EndlessRecyclerOnScrollListener scrollListener = (EndlessRecyclerOnScrollListener) recyclerView.getOnScrollListener(); scrollListener.resetScrollState(); // Clear existing data in your adapter mAdapter.clearWorkList(); mAdapter.notifyDataSetChanged(); // Load fresh data loadFreshWorkData(); } }); // Example fresh data loading method private void loadFreshWorkData() { // Simulate API call or data fetch new Handler().postDelayed(() -> { List<WorkItem> freshData = fetchFreshData(); mAdapter.updateWorkList(freshData); mAdapter.notifyDataSetChanged(); // Stop the refresh animation mSwipeRefreshLayout.setRefreshing(false); }, 1500); }
3. Avoid Re-Creating the Adapter or Scroll Listener
If you’re creating a new instance of your adapter (e.g., mAdapter = new WorkAdapter(new ArrayList<>())) every time you refresh, you don’t need to—but if you do, make sure you reattach the scroll listener to the RecyclerView. However, it’s better to reuse the same adapter instance and just update its data, since this avoids unnecessary view rebinding and listener issues.
4. Verify the Scroll Listener’s Trigger Logic
Double-check that your EndlessRecyclerOnScrollListener’s onScrolled method correctly checks for scroll position and state. For example, it should only trigger onLoadMore if:
- The user has scrolled to the bottom of the list
isLoadingisfalsehasMoreDataistrue
If any of these conditions are stuck in an invalid state (like isLoading staying true after a failed load), the listener won’t work. The reset method we added fixes this by resetting all these flags.
内容的提问来源于stack exchange,提问作者Jafar Taheri

