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

Android Studio中RecyclerView Adapter报错ArrayList大小恒为0问题求解

问题根因

  1. 异步请求时序问题:Volley 网络请求是异步执行的,你在 get_forecast_data 方法中把请求加入队列后立刻打印 ArrayList 大小,此时网络请求还未完成,onResponse 回调还没触发,数据还没添加到列表中,所以打印结果始终为0。
  2. 未通知Adapter数据变更:就算后续网络请求成功,数据被添加到 ArrayList 中,你也没有通知 RecyclerView 的 Adapter 数据发生了变更,列表不会主动刷新,所以不会触发 onBindViewHolder 方法,页面也看不到内容。
  3. 图标字段处理错误:OpenWeather 接口返回的 icon 字段是类似 01d、02n 的带后缀字符串,你直接转int会抛出NumberFormatException,后续列表加载时会崩溃。

修复方案

1. 数据加载完成后通知Adapter刷新

修改 get_forecast_data 方法中的 onResponse 回调,数据添加完成后调用 notifyDataSetChanged() 通知Adapter刷新:

@Override
public void onResponse(JSONObject response) {
    try {
        JSONArray daily = response.getJSONArray("daily");
        for(int i=0;i<daily.length();i++){
            String  temp = daily.getJSONObject(i).getJSONObject("temp").getString("day");
            String feels_like = daily.getJSONObject(i).getJSONObject("feels_like").getString("day");
            String pressure = daily.getJSONObject(i).getString("pressure");
            String humidity = daily.getJSONObject(i).getString("humidity");
            String wind_speed = daily.getJSONObject(i).getString("wind_speed");
            String icon = daily.getJSONObject(i).getJSONArray("weather").getJSONObject(0).getString("icon");
            String description = daily.getJSONObject(i).getJSONArray("weather").getJSONObject(0).getString("description");
            arrayList.add(new RecyclerviewModel(temp,humidity,feels_like,pressure,description,wind_speed,icon));
        }
        // 新增:数据加载完成后通知Adapter刷新
        forecastAdapter.notifyDataSetChanged();
        // 这里打印可以看到实际的列表大小
        System.out.println("加载完成后arrayList大小:" + arrayList.size());
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

2. 修复图标加载逻辑

修改 ForecastAdapter 中的 load_weather_icon 方法,先截取icon字段的前两位数字再转int:

public void load_weather_icon(String id,MyForecastViewHolder holder ){
    // 新增:截取icon前两位的数字部分,避免转int报错
    String iconNum = id.substring(0,2);
    int id1 = Integer.valueOf(iconNum);
    // 后续的if判断逻辑保持不变
    if(id1>=200 && id1 <= 232){
        holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.thunderstorm);
    } 
    // ... 其余判断逻辑保持原样
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:15:00