android - Recyclerview 中不显示改造响应对象
问题描述
我有一些从网络上获取的 json 数据,我正在使用改造来检索我的存储库并将其发送到我的视图模型以显示在活动中。响应全部成功,我验证了我的 POJO 与 json 匹配。当我创建硬编码的 Team 对象并将其从存储库响应发送到我的视图模型时,我得到的数据显示在 UI 中,但不是来自响应。这是我的存储库。
private TeamRepo() {
teamMutableLiveData = new MutableLiveData<>();
}
public MutableLiveData<Team> getTeam(final String team){
RetrofitServiceApi retrofitServiceApi = RetrofitService.getRetrofitInstance()
.create(RetrofitServiceApi.class);
Call<Team> teamCall = retrofitServiceApi.getTeam(team);
teamCall.enqueue(new Callback<Team>() {
@Override
public void onResponse(Call<Team> call, Response<Team> response) {
if(response.isSuccessful()) {
Log.e("response", response.toString());
teamMutableLiveData.setValue(response.body());
if (response.body() != null) {
Log.e("response body", response.message());
}
//teamMutableLiveData.setValue(team);
}
}
@Override
public void onFailure(Call<Team> call, Throwable t) {
Log.e("error response", t.toString());
//TODO
}
});
return teamMutableLiveData;
}
我的 api 如下所示。
@GET("api/v1/json/1/searchteams.php")
Call<Team> getTeam(@Query("t") String team);
服务是
private static Retrofit retrofit;
private static final String BASE_URL = "https://www.thesportsdb.com/";
public static synchronized Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new retrofit2.Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
https://www.thesportsdb.com/api/v1/json/1/searchteams.php?t=Arsenal
部分 json 数据如下所示
{
"teams": [
{
"idTeam": "133604",
"idSoccerXML": "9",
"idAPIfootball": "42",
"intLoved": "2",
"strTeam": "Arsenal",
"strTeamShort": "Ars",
"strAlternate": "Gunners, Arsenal Football Club, AFC",
"intFormedYear": "1892",
}
]
}
POJO团队如下
public class Team {
@SerializedName("idTeam")
private String idTeam;
@SerializedName("idSoccerXML")
private String idSoccerXML;
@SerializedName("idAPIfootball")
private String idAPIfootball;
@SerializedName("intLoved")
private String intLoved;
@SerializedName("strTeam")
private String strTeam;
@SerializedName("strTeamShort")
private String strTeamShort;
@SerializedName("strAlternate")
private String strAlternate;
@SerializedName("intFormedYear")
private String intFormedYear;
public String getIdTeam() {
return idTeam;
}
public void setIdTeam(String idTeam) {
this.idTeam = idTeam;
}
public String getIdSoccerXML() {
return idSoccerXML;
}
public void setIdSoccerXML(String idSoccerXML) {
this.idSoccerXML = idSoccerXML;
}
public String getIdAPIfootball() {
return idAPIfootball;
}
public void setIdAPIfootball(String idAPIfootball) {
this.idAPIfootball = idAPIfootball;
}
public String getIntLoved() {
return intLoved;
}
public void setIntLoved(String intLoved) {
this.intLoved = intLoved;
}
public String getStrTeam() {
return strTeam;
}
public void setStrTeam(String strTeam) {
this.strTeam = strTeam;
}
public String getStrTeamShort() {
return strTeamShort;
}
public void setStrTeamShort(String strTeamShort) {
this.strTeamShort = strTeamShort;
}
public String getStrAlternate() {
return strAlternate;
}
public void setStrAlternate(String strAlternate) {
this.strAlternate = strAlternate;
}
public String getIntFormedYear() {
return intFormedYear;
}
public void setIntFormedYear(String intFormedYear) {
this.intFormedYear = intFormedYear;
}
}
解决方案
服务器响应是一个 JSON 对象,其中包含一个“团队”数组。您需要创建一个SearchResult
对象:
public class SearchResult {
@SerializedName("teams")
private List<Team> teams;
public List<Team> getTeams() {
return teams;
}
}
然后替换您对 Retrofit 的调用以返回一个SearchResult
对象:
@GET("api/v1/json/1/searchteams.php")
Call<SearchResult> getTeam(@Query("t") String team);
你会得到结果
response.body().getTeams(); // Don't forget to check for nulls
推荐阅读
- java - AspectJ 建议未执行
- laravel - 日期和时间戳格式和唯一规则
- java - 使用网络代理 (nanoHTTPD) 即时流式传输 [随机访问] 加密 (AES-CTR) 视频
- unity3d - 粒子系统在一次射击后不会停止
- java - 我需要一个程序,它会要求用户在文件中逐行输入要保存的信息。我该怎么做?
- shopify - 从产品描述中删除图像
- c# - VS 2019 中的 CustomVisualizer 扩展
- django - 为什么 Django serializer.data 步骤很慢?
- python - 如何将正则表达式找到的字符串从一个文件复制到另一个文件,同时保持两个文件的结构?
- java - Java 12.0.1 中的 JavaFX