使用Retrofit获取数据绑定到RecyclerView适配器时App崩溃如何解决?
问题根源
最直接的崩溃原因在adapter.java的onBindViewHolder方法中:
holder.t1.setText((int) data.get(position).getId());
你将id强转成int类型后直接传给setText(),Android的TextView.setText(int resId)重载会把传入的int值当成字符串资源ID,去res/values/strings.xml中查找对应资源,找不到匹配ID的资源就会抛出Resources.NotFoundException触发崩溃。
修复方案
1. 修复适配器赋值逻辑
把数值类型的id转成字符串后再传给setText,两种写法均可:
// 写法1:显式转字符串 holder.t1.setText(String.valueOf((int) data.get(position).getId())); // 写法2:拼接文本转字符串 holder.t1.setText("序号: " + (int) data.get(position).getId());
2. 可选优化(规避后续潜在问题)
- 补全Retrofit BaseUrl后缀斜杠:
retrofitInstance.java中的baseUrl末尾需要加/,避免路径拼接出错:private static final String commonURL = "https://jsonplaceholder.typicode.com/"; - 优化数据模型字段类型:接口返回的
userId、id本身是整型,直接用int/long接收更合理,避免浮点型精度问题:// 修改jsonData.java的字段定义,同步修改对应getter、setter的返回值、入参类型 private int userId; private int id; - 优化适配器初始化逻辑:不需要每次拿到数据都新建适配器,可以在
onCreate中先初始化空适配器绑定给RecyclerView,拿到数据后更新数据集再调用notifyDataSetChanged()即可,性能更好。
3. Logcat无报错排查
如果后续仍看不到崩溃日志,检查Logcat过滤设置:
- 顶部过滤级别选择
Error - 过滤条件选择
Show only selected application - 确认当前选中的进程是你的App对应的包名
内容的提问来源于stack exchange,提问作者Saher Ikram
相关产品推荐
相关产品推荐

