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

从Adapter获取数据存入列表时触发空指针异常的技术求助

解决空指针异常并实现数据存入列表的方案

看你贴的代码和报错信息,问题很明确:你给RoutePlanDayRequests requests和List<RoutePlanDayRequests> routePlanDayRequests都赋值成了null,直接调用它们的方法/add操作肯定会触发空指针!下面给你一步步修正:

核心问题分析

  • 第92行的requests.setPartnerId(...)崩溃,因为requests只是声明了但没有实例化,还是个空对象
  • 就算解决了requests的问题,routePlanDayRequests.add(requests)也会崩溃,因为这个列表同样是null,没有初始化

具体修复步骤

  1. 初始化列表对象:把List<RoutePlanDayRequests> routePlanDayRequests=null;改成List<RoutePlanDayRequests> routePlanDayRequests = new ArrayList<>();,这样列表才有内存空间存放数据
  2. 在循环内实例化RoutePlanDayRequests:每次循环都要创建一个新的对象,不然所有循环条目都会复用同一个对象,最后列表里的所有元素数据都会是最后一次循环的内容
  3. 增加空安全检查:避免adapter或者selectedView为空的情况,防止其他潜在空指针

修改后的完整代码

submitChangeRequest.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 先做空检查,避免adapter为空
        RoutePlanVisitChangeAdapter adapter = (RoutePlanVisitChangeAdapter) mRecyclerView.getAdapter();
        if (adapter == null || adapter.getItemCount() == 0) {
            return; // 没有数据就直接返回,避免后续循环报错
        }

        // 初始化列表,不能为null
        List<RoutePlanDayRequests> routePlanDayRequests = new ArrayList<>();

        for (int i = 0; i < adapter.getItemCount(); i++) {
            Retailers selectedView = adapter.getItem(i);
            // 检查selectedView是否为空
            if (selectedView == null) {
                continue;
            }

            View dataView = mRecyclerView.getChildAt(i);
            Spinner toDaySpinner = (Spinner) dataView.findViewById(R.id.to_day);
            
            String oldDay = selectedView.getRoutePlanDayOfWeek();
            String newDay = toDaySpinner.getSelectedItem().toString();
            String msisdn = selectedView.getMsisdn();

            // 每次循环都新建一个对象,不能复用外面的null对象
            RoutePlanDayRequests requests = new RoutePlanDayRequests();
            requests.setPartnerId(msisdn);
            requests.setParentPartnerId(msisdn);
            requests.setApproverId("1");
            requests.setStatus("0");
            requests.setRetailerPrmId(msisdn);
            requests.setOldDay(oldDay);
            requests.setNeweDay(newDay); // 注意这里你原代码写的是NeweDay,确认下字段名是否正确

            routePlanDayRequests.add(requests);
        }

        // 把updateServiceList移到循环外面!不然每次循环都调用接口,会重复请求
        if (!routePlanDayRequests.isEmpty()) {
            updateServiceList(AppUtils.getMsisdn(mSharedPreferences), routePlanDayRequests);
        }
    }
});

额外提示

  • 原代码里updateServiceList放在循环内部,会导致每循环一次就调用一次接口,这显然不合理,我把它移到了循环外面,只有当列表不为空时才调用
  • 注意requests.setNeweDay(newDay)里的NeweDay,确认下你的实体类字段名是不是拼写错误(应该是newDay?),避免字段赋值失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:09:21