英文:
Retrofit2 with Android Studio: Cant get the array of petrol-stations
问题
Here's the translated code you provided:
package com.example.benzinpreise;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.*;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView textViewResult;
private List<Tankstellen.Stations> tankstellenList = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewResult = findViewById(R.id.text_view_result);
getTankstellen();
}
private void getTankstellen() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(TankstellenApi.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
TankstellenApi tankstellenApi = retrofit.create(TankstellenApi.class);
Call<Tankstellen> call = tankstellenApi.getTankstellen("57.001", "10.007", "7", "all", "dist", TankstellenApi.API_KEY);
call.enqueue(new Callback<Tankstellen>() {
@Override
public void onResponse(Call<Tankstellen> call, Response<Tankstellen> response) {
String displayResponse = "";
String displayStations = "";
Tankstellen antwort = response.body();
tankstellenList = antwort.stationsList;
displayResponse += "ok: " + antwort.isOk() + "\n" + "license: " + antwort.getLicense() + "\n" + "data: " + antwort.getData() + "\n" + "status: " + antwort.getStatus() + "\n";
for (Tankstellen.Stations stationen : tankstellenList) {
displayStations += stationen.id + " "
+ stationen.name + " "
+ stationen.brand + " "
+ stationen.street + " "
+ stationen.place + " "
+ stationen.lat + " "
+ stationen.lng + " "
+ stationen.dist + " "
+ stationen.diesel + " "
+ stationen.e5 + " "
+ stationen.e10 + " "
+ stationen.isOpen + " "
+ stationen.houseNumber + " "
+ stationen.postCode + "\n";
}
textViewResult.setText(displayResponse + "\n" + displayStations);
}
@Override
public void onFailure(Call<Tankstellen> call, Throwable t) {
textViewResult.setText(t.getMessage());
}
});
}
}
package com.example.benzinpreise;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class Tankstellen {
private boolean ok;
private String license;
private String data;
private String status;
@SerializedName("stations")
public List<Stations> stationsList = null;
public class Stations {
@SerializedName("id")
public String id;
public String name;
public String brand;
public String street;
public String place;
public double lat;
public double lng;
public double dist;
public double diesel;
public double e5;
public double e10;
public boolean isOpen;
public String houseNumber;
public int postCode;
}
public boolean isOk() {
return ok;
}
public String getLicense() {
return license;
}
public String getData() {
return data;
}
public String getStatus() {
return status;
}
}
package com.example.benzinpreise;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface TankstellenApi {
String BASE_URL = "https://creativecommons.tankerkoenig.de/";
String API_KEY = "50d25698-e799-22df-c47c-833b7ae62b8b";
@GET("json/list.php")
Call<Tankstellen> getTankstellen(
@Query("lat") String lat,
@Query("lng") String lng,
@Query("rad") String umkreis,
@Query("type") String type,
@Query("sort") String filter,
@Query("apikey") String apikey);
}
The problem you're facing might be related to the fact that you are setting the response text in the textViewResult only outside the for loop that iterates through the tankstellenList. I've adjusted the code to concatenate both the response and station details, which should display the complete response including the station information.
英文:
Api response:
{
"ok": true,
"license": "CC BY 4.0 - https:\/\/creativecommons.tankerkoenig.de",
"data": "MTS-K",
"status": "ok",
"stations": [
{
"id": "35885891-164a-4cc7-a6c9-3c6f7f4e6845",
"name": "Andreas Linke",
"brand": "Nordoel",
"street": "Peiner Str.",
"place": "Sehnde",
"lat": 52.31519,
"lng": 9.972986,
"dist": 2.3,
"diesel": 1.109,
"e5": 1.279,
"e10": 1.239,
"isOpen": true,
"houseNumber": "52",
"postCode": 31319
},
{
"id": "d4cb468e-86b0-4aa0-a862-5677d22cbab1",
"name": "ACCESS Tankstelle Sehnde",
"brand": "Access",
"street": "LEHRTER STR. 20",
"place": "SEHNDE",
"lat": 52.317781,
"lng": 9.966101,
"dist": 2.8,
"diesel": 1.109,
"e5": 1.279,
"e10": 1.249,
"isOpen": true,
"houseNumber": "",
"postCode": 31319
},
{
"id": "5bf0bee3-4dc0-4f6e-a846-cb0ac3ac2efc",
"name": "Aral Tankstelle",
"brand": "ARAL",
"street": "Iltener Straße",
"place": "Sehnde",
"lat": 52.3173637,
"lng": 9.959905,
"dist": 3.2,
"diesel": 1.139,
"e5": 1.319,
"e10": 1.289,
"isOpen": true,
"houseNumber": "8",
"postCode": 31319
},
{
"id": "096ac8b7-190d-4def-a860-6d2002f4b84e",
"name": "M1 Lehrte",
"brand": "M1",
"street": "Everner Str.",
"place": "Lehrte",
"lat": 52.36773,
"lng": 9.9967,
"dist": 5.6,
"diesel": 1.109,
"e5": null,
"e10": null,
"isOpen": true,
"houseNumber": "41",
"postCode": 31275
},
{
"id": "e1a15081-25ed-9107-e040-0b0a3dfe563c",
"name": "Sehnde, Kirchstr. 17",
"brand": "HEM",
"street": "Kirchstr.",
"place": "Sehnde",
"lat": 52.34744,
"lng": 9.928732,
"dist": 6.2,
"diesel": 1.109,
"e5": 1.269,
"e10": null,
"isOpen": true,
"houseNumber": "17",
"postCode": 31319
},
{
"id": "375a1dbb-4d61-4a4b-825a-3b2e3c0b82d8",
"name": "Lehrte , Ahltener Straße 15",
"brand": "bft",
"street": "Ahltener Straße 15",
"place": "Lehrte",
"lat": 52.372474,
"lng": 9.97253,
"dist": 6.5,
"diesel": 1.109,
"e5": 1.309,
"e10": 1.279,
"isOpen": true,
"houseNumber": "",
"postCode": 31275
},
{
"id": "45b00a42-93fa-41fe-9f9b-977b25a9832f",
"name": "OIL! Tankstelle Lehrte",
"brand": "OIL!",
"street": "Mielestr. 20",
"place": "Lehrte",
"lat": 52.3804,
"lng": 10.0061,
"dist": 6.9,
"diesel": 1.109,
"e5": 1.279,
"e10": 1.249,
"isOpen": true,
"houseNumber": "",
"postCode": 31275
}
]
}
MainActivity.java:
package com.example.benzinpreise;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.Result;
import retrofit2.*;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private TextView textViewResult;
private List<Tankstellen> tankstellenList = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewResult =findViewById(R.id.text_view_result);
getTankstellen();
}
private void getTankstellen(){
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(TankstellenApi.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
TankstellenApi tankstellenApi = retrofit.create(TankstellenApi.class);
Call<Tankstellen> call = tankstellenApi.getTankstellen("57.001","10.007","7","all","dist",TankstellenApi.API_KEY);
call.enqueue(new Callback<Tankstellen>() {
@Override
public void onResponse(Call<Tankstellen> call, Response<Tankstellen> response) {
String displayResponse = "";
String displayStations ="";
Tankstellen antwort = response.body();
List<Tankstellen.Stations> tankstellenList = antwort.stationsList;
displayResponse += "ok: " +antwort.isOk() +"\n" + "license: "+antwort.getLicense() +"\n"+ "data: "+antwort.getData() +"\n"+ "status: "+antwort.getStatus() +"\n";
for(Tankstellen.Stations stationen : tankstellenList){
displayResponse += stationen.id + " "
+ stationen.name + " "
+ stationen.brand + " "
+ stationen.street + " "
+ stationen.place + " "
+ stationen.lat + " "
+ stationen.lng + " "
+ stationen.dist + " "
+ stationen.diesel + " "
+ stationen.e5 + " "
+ stationen.e10 + " "
+ stationen.isOpen + " "
+ stationen.houseNumber + " "
+ stationen.postCode;
}
textViewResult.setText(displayResponse);
}
@Override
public void onFailure(Call<Tankstellen> call, Throwable t) {
textViewResult.setText(t.getMessage());
}
});
}
}
Tanktstellen.java
package com.example.benzinpreise;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.List;
public class Tankstellen {
private boolean ok;
private String license;
private String data;
private String status;
@SerializedName("stations")
public List <Stations> stationsList = null;
public class Stations{
@SerializedName("id")
public String id;
public String name;
public String brand;
public String street;
public String place;
public double lat;
public double lng;
public double dist;
public double diesel;
public double e5;
public double e10;
public boolean isOpen;
public String houseNumber;
public int postCode;
}
public boolean isOk() {
return ok;
}
public String getLicense() {
return license;
}
public String getData() {
return data;
}
public String getStatus() {
return status;
}
}
TankstellenAPI.java:
package com.example.benzinpreise;
import com.google.gson.JsonObject;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface TankstellenApi {
String BASE_URL = "https://creativecommons.tankerkoenig.de/";
String API_KEY = "50d25698-e799-22df-c47c-833b7ae62b8b";
@GET("json/list.php")
Call<Tankstellen> getTankstellen (@Query("lat") String lat,
@Query("lng") String lng,
@Query("rad") String umkreis,
@Query("type") String type,
@Query("sort") String filter,
@Query("apikey") String apikey);
}
In the code are some german keywords just for me so i can understand the code a little bit better. I hope there are not confusing.
My Problem:
Im only getting
ok: true
license: CC BY 4.0 - https:\/\/creativecommons.tankerkoenig.de
data: MTS-K
status: ok
The array is not iterating trough the for loop to display the array of petrol stations. I don't know why. Can anyone help me with this?
答案1
得分: 0
我克隆了你的代码并运行了。错误出现在你的回应中。
Antwort.stationslist.size = 0
这就是为什么它没有在循环中迭代,无法显示加油站数组。
英文:
I cloned your code and ran. The error is in your response.
Antwort.stationslist.size = 0
That's why it is not iterating trough the for loop to display the array of petrol stations.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论