从Adapter获取数据存入列表时触发空指针异常的技术求助
解决空指针异常并实现数据存入列表的方案
看你贴的代码和报错信息,问题很明确:你给RoutePlanDayRequests requests和List<RoutePlanDayRequests> routePlanDayRequests都赋值成了null,直接调用它们的方法/add操作肯定会触发空指针!下面给你一步步修正:
核心问题分析
- 第92行的
requests.setPartnerId(...)崩溃,因为requests只是声明了但没有实例化,还是个空对象 - 就算解决了
requests的问题,routePlanDayRequests.add(requests)也会崩溃,因为这个列表同样是null,没有初始化
具体修复步骤
- 初始化列表对象:把
List<RoutePlanDayRequests> routePlanDayRequests=null;改成List<RoutePlanDayRequests> routePlanDayRequests = new ArrayList<>();,这样列表才有内存空间存放数据 - 在循环内实例化
RoutePlanDayRequests:每次循环都要创建一个新的对象,不然所有循环条目都会复用同一个对象,最后列表里的所有元素数据都会是最后一次循环的内容 - 增加空安全检查:避免
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
相关产品推荐
相关产品推荐

