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

使用两个RecyclerView时出现除零错误(Division by zero error)求助

解决双RecyclerView布局中的除零错误

嘿,我来帮你搞定这个RecyclerView的除零错误问题!从你给出的代码片段和场景来看,这个问题的核心肯定是某个除法/取模操作的除数变成了0,结合双RecyclerView的使用场景,我整理了几个排查和修复的思路:

1. 先定位出问题的变量

你代码里提到的mScrollOffset % ...这个省略的部分,大概率是和子项尺寸相关的变量(比如item的高度/宽度,比如mChildSize这类)。这个变量为0的常见原因:

  • 子项还没完成布局测量:RecyclerView刚初始化时,子项还没被绘制,此时获取的item尺寸就是0
  • 子项用了wrap_content但内容为空:导致系统计算出的item尺寸为0
  • 自定义LayoutManager时,没有正确初始化这个尺寸变量

2. 双RecyclerView场景的特殊排查点

因为你同时用了两个RecyclerView,还要注意这些情况:

  • 其中一个RecyclerView的子项尺寸没初始化,却被另一个的滚动逻辑不小心引用了
  • 两个RecyclerView的滚动监听或LayoutManager复用了同一个实例,导致尺寸变量被意外重置为0

3. 具体的修复方案

方案一:给除数加非零判断

在执行取模/除法操作前,先检查除数是否为0,避免直接触发错误:

public int getFixedScrollPosition(int direction, float fixValue) {
    // 先确保子项尺寸有效,再执行后续逻辑
    if (mCheckedChildSize && mChildSize != 0) { 
        if (mScrollOffset % mChildSize == 0) {
            // 这里放你原来的业务逻辑
        } else {
            // 除数为0时返回默认位置,避免崩溃
            return RecyclerView.NO_POSITION;
        }
    }
    // 子项还没准备好时,返回默认值
    return RecyclerView.NO_POSITION;
}

方案二:等布局完成后再初始化尺寸

在RecyclerView的布局完成回调里去获取子项尺寸,确保拿到的是有效数值:

@Override
public void onLayoutCompleted(RecyclerView.State state) {
    super.onLayoutCompleted(state);
    // 获取第一个可见子项的尺寸,确保数值有效
    View firstChild = findViewByPosition(0);
    if (firstChild != null) {
        // 根据RecyclerView的方向获取对应的尺寸
        mChildSize = getOrientation() == VERTICAL ? firstChild.getHeight() : firstChild.getWidth();
        mCheckedChildSize = true;
    }
}

方案三:隔离两个RecyclerView的状态

如果两个RecyclerView用了自定义的LayoutManager,一定要给它们各自创建独立的实例,不要复用同一个对象,避免变量互相覆盖导致尺寸变成0。

如果按照上面的方法还是没解决,你可以把完整的getFixedScrollPosition方法和相关变量的初始化代码贴出来,这样能更精准地定位问题哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:16:04