You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

清除RecyclerView数据后setOnScrollListener失效问题求助

Fix for RecyclerView Scroll Listener Not Working After Clearing Data

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
  • isLoading is false
  • hasMoreData is true

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:12:33