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

Android Java用Retrofit请求API填充Spinner遇注解异常求助

问题解决:Retrofit调用报错与Spinner填充优化

1. 核心错误:Retrofit接口参数缺少注解

报错No Retrofit annotation found. (parameter #1)的原因是API接口中fetchBoardList方法的username参数未绑定URL里的{username}占位符,必须用@Path注解标记该参数,让Retrofit知道如何替换URL中的占位符。

修改后的API接口代码:

@GET("/payment/fetch/board/{username}")
Call<List<BoardResponse>> fetchBoardList(@Path("username") String username);

2. 冗余的JSON手动解析(会触发后续异常)

你的onResponse方法存在逻辑错误:Retrofit已经自动将响应体解析为List<BoardResponse>,不需要再把它转成字符串手动解析JSON——List.toString()的输出不是标准JSON格式,必然会抛出JSONException。直接使用解析好的列表即可。

3. 修正后的完整Retrofit调用代码

Call<List<BoardResponse>> call = RetrofitClient.getInstance().getMyApi().fetchBoardList(username);
call.enqueue(new Callback<List<BoardResponse>>() {
    @Override
    public void onResponse(@NonNull Call<List<BoardResponse>> call, @NonNull Response<List<BoardResponse>> response) {
        if (response.isSuccessful() && response.body() != null) {
            List<BoardResponse> boardListFromApi = response.body();
            // 提取Spinner需要的board名称列表
            List<String> boardNames = new ArrayList<>();
            for (BoardResponse board : boardListFromApi) {
                boardNames.add(board.getBoard());
            }
            // 设置Spinner适配器
            ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<>(
                    PaymentEntryActivity.this,
                    android.R.layout.simple_spinner_item,
                    boardNames
            );
            spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            // 替换成你Activity中实际的Spinner实例变量,不要直接用类名Spinner
            yourSpinnerInstance.setAdapter(spinnerArrayAdapter);
        }
    }

    @Override
    public void onFailure(@NonNull Call<List<BoardResponse>> call, @NonNull Throwable t) {
        // 可添加失败处理逻辑,比如Toast提示
        t.printStackTrace();
    }
});

额外注意事项

  • 确保BoardResponse类的字段名与API返回的JSON字段完全匹配,若字段名不一致,需用@SerializedName注解映射(例如JSON字段是board_id,类字段是boardID,需添加@SerializedName("board_id"))。
  • 代码中的yourSpinnerInstance要替换为你Activity中实际的Spinner对象,直接写Spinner.setAdapter会编译报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:20:17