使用Volley请求接口时出现RecyclerView无适配器及Gson解析异常问题
问题解决方案
1. 修复Gson解析报错
报错原因是你返回的JSON外层是对象结构,而非直接的PoetryModel数组,因此需要新增一个外层响应实体类适配接口结构:
步骤1:新建ApiResponse.java
package com.example.poetryapp.model; import java.util.List; public class ApiResponse { private String status; private String message; private List<PoetryModel> data; public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public List<PoetryModel> getData() { return data; } public void setData(List<PoetryModel> data) { this.data = data; } }
步骤2:修改MainActivity的onResponse解析逻辑
@Override public void onResponse(String response) { Log.e("success",response); Gson gson = new GsonBuilder().create(); // 解析为外层响应对象 ApiResponse apiResponse = gson.fromJson(response, ApiResponse.class); // 状态判断后取数据 if ("1".equals(apiResponse.getStatus()) && apiResponse.getData() != null) { PoetryModel[] data = apiResponse.getData().toArray(new PoetryModel[0]); MyAdapter myAdapter = new MyAdapter(data); recyclerView.setAdapter(myAdapter); } else { Toast.makeText(MainActivity.this, apiResponse.getMessage(), Toast.LENGTH_LONG).show(); } }
2. 修复RecyclerView「No adapter attached」警告
该警告是因为Volley请求是异步的,页面首次绘制时RecyclerView还未设置Adapter,在onCreate初始化时提前设置空Adapter即可:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.poetry_recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); // 提前设置空Adapter消除警告 recyclerView.setAdapter(new MyAdapter(new PoetryModel[0])); loaddata(); }
3. 其他常见问题排查
- 检查接口URL笔误:你当前的URL后缀写了两次
.php,修正为http://192.168.137.198/poetryapi/getPoetryRead.php - 确认AndroidManifest.xml已添加网络权限:
<uses-permission android:name="android.permission.INTERNET" /> - 安卓9及以上默认禁止明文HTTP请求,需配置网络安全策略允许HTTP访问:
在res/xml目录新建network_security_config.xml:
然后在AndroidManifest.xml的application标签添加属性:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>android:networkSecurityConfig="@xml/network_security_config" - 确认手机和XAMPP服务端处于同一局域网,IP地址可正常访问。
内容的提问来源于stack exchange,提问作者Pros Cons
相关产品推荐
相关产品推荐

