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

Android嵌套滚动视图onScroll页码不递增问题排查

滚动时页码不递增的原因及修复方案

核心原因分析

1. RecyclerView高度设置导致NestedScrollView无法触发滚动

你的布局中,RecyclerView的android:layout_height="match_parent",而它的父容器RelativeLayout是wrap_content,NestedScrollView的子LinearLayout同样是wrap_content。这种配置会让RecyclerView直接展开显示所有列表项,NestedScrollView的内容高度不会超过自身可视高度,根本不会产生滚动行为,自然不会触发onScrollChange里的底部判断逻辑。

2. 滚动底部的判断条件过于严苛

即使能触发滚动,scrollY == v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()的绝对相等判断极易失效——快速滚动时scrollY的数值可能跳过这个精确值,导致无法触发页码递增。

3. 页码递增后未联动数据请求

你在onScrollChange里只做了page++和显示进度条,但没有调用ViewModel的方法请求对应页码的数据。原有的getAllTaskTemplatesByStatus(status)没有传入分页参数,只会加载全量数据,分页逻辑完全没联动。


修复步骤

步骤1:调整RecyclerView高度,让NestedScrollView能滚动

将RecyclerView的高度改为wrap_content,让它根据内容自适应高度,这样NestedScrollView才会在内容超出时产生滚动:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/taskList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" <!-- 修改此处 -->
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    app:layoutManager="LinearLayoutManager"
    tools:context=".view.activity.dailyTask.DailyTaskListActivity"
    tools:listitem="@layout/task_item" />

步骤2:修改滚动底部的判断逻辑

把绝对相等改为>=,同时添加加载状态标记避免重复触发:

// 添加全局变量标记加载状态
private boolean isLoading = false;

nestedSV.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
    @Override
    public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        // 避免重复加载 + 判断是否滚动到底部
        if (!isLoading && scrollY >= v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()) {
            isLoading = true;
            page++;
            loadingPB.setVisibility(View.VISIBLE);
            // 调用ViewModel的分页接口请求数据
            dailyTaskViewModel.getTaskTemplatesByStatusAndPage(status, page);
        }
    }
});

步骤3:实现ViewModel的分页数据接口

给ViewModel添加带分页参数的方法,示例:

// ViewModel中新增分页请求方法
public LiveData<List<TaskTemplateWithTasks>> getTaskTemplatesByStatusAndPage(String status, int page) {
    // 根据页码和状态请求对应数据,比如每页3条,计算起始偏移量
    int pageSize = 3;
    int startPos = (page - 1) * pageSize;
    return repository.getTaskTemplatesByStatusRange(status, startPos, pageSize);
}

步骤4:调整数据适配逻辑(追加而非替换)

当page>1时,要把新数据追加到原有列表,而不是直接替换:

// 假设适配器新增addTaskTemplates方法用于追加数据
dailyTaskViewModel.getTaskTemplatesByStatusAndPage(status, page).observe(this, templateWithTasks -> {
    taskCount = templateWithTasks.size();
    messageText.setVisibility(templateWithTasks.isEmpty() ? View.VISIBLE : View.GONE);

    if (page == 1 && templateWithTasks.size() > 3) {
        List<TaskTemplateWithTasks> limitedList = templateWithTasks.subList(0, 3);
        dailyTaskListAdapter.setTaskTemplates(new ArrayList<>(limitedList));
    } else if (page > 1) {
        // 追加新数据
        dailyTaskListAdapter.addTaskTemplates(templateWithTasks);
    } else {
        dailyTaskListAdapter.setTaskTemplates(templateWithTasks);
    }

    dailyTaskListAdapter.notifyDataSetChanged();
    findViewById(R.id.search).setText("");
    startAdapterFilter(searchText);
    
    // 加载完成后重置状态
    isLoading = false;
    loadingPB.setVisibility(View.GONE);
});

内容的提问来源于stack exchange,提问作者Milindi Senevirathne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:27:53