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

使用Volley为RecyclerView加载JSON时遇未绑定适配器错误

解决RecyclerView无适配器警告+Volley请求无响应问题

我来帮你拆解并解决这两个问题:

第一个问题:RecyclerView: No adapter attached; skipping layout

这个警告本质是因为Volley请求是异步的,在你的网络请求返回数据前,RecyclerView已经完成了首次绘制,此时它还没有绑定任何适配器,所以系统抛出这个提示。

解决方法很简单:提前给RecyclerView绑定一个空适配器,不要等到请求成功后才创建适配器。比如在onCreate方法里就完成初始化:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    mRecyclerView = findViewById(R.id.recycler_view);
    // 必须设置LayoutManager,这也是很多人忽略的坑!
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    
    // 初始化空列表和适配器
    mMovieList = new ArrayList<>();
    mMovieAdapter = new MovieAdapter(MainActivity.this, mMovieList);
    mRecyclerView.setAdapter(mMovieAdapter);
    
    // 再调用请求方法
    parseJSON();
}

第二个问题:第二个Log不打印,说明Volley请求没走到onResponse

这大概率是请求失败了,但你的错误监听只打印了堆栈,没输出关键错误信息。我们先修改parseJSON方法,增强错误排查能力,同时优化数据更新逻辑:

private void parseJSON() {
    // 建议改用HTTPS的URL,避免Android 9+的明文网络限制
    String url = "https://api.themoviedb.org/3/movie/popular?api_key=你的API密钥";
    Log.e("debug", "开始发起网络请求");
    
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, 
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.e("debug", "请求成功,开始解析JSON");
                try {
                    JSONArray jsonArray = response.getJSONArray("results");
                    mMovieList.clear(); // 清空旧数据,避免重复添加
                    for(int i = 0; i < jsonArray.length(); i++){
                        JSONObject result = jsonArray.getJSONObject(i);
                        String imageUrl = "https://image.tmdb.org/t/p/w185" + result.getString("poster_path");
                        mMovieList.add(new Movie(imageUrl));
                    }
                    // 通知适配器数据更新,不用重新创建适配器
                    mMovieAdapter.notifyDataSetChanged();
                } catch (JSONException e) {
                    Log.e("JSON解析错误", "原因:" + e.getMessage());
                    e.printStackTrace();
                }
            }
        }, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // 打印详细错误信息,方便排查
                Log.e("Volley请求失败", "错误详情:" + error.toString());
                if (error.networkResponse != null) {
                    Log.e("Volley错误码", "状态码:" + error.networkResponse.statusCode);
                }
                error.printStackTrace();
            }
        });
    // 确保RequestQueue已经初始化:mRequestQueue = Volley.newRequestQueue(this);
    mRequestQueue.add(request);
}

额外需要排查的点

  1. API密钥有效性:确认你的TMDB API密钥是正确的,并且在TMDB后台没有设置IP/域名限制(测试阶段可以暂时关闭限制)
  2. 网络权限:在AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  3. Android 9+明文网络限制:如果用HTTP的URL,需要在AndroidManifest.xml的application标签里添加:
    android:usesCleartextTraffic="true"
    
    更推荐的方式是改用上面代码中的HTTPS URL,从根源避免这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:30:45