英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论