Je l'analyse d'une API Cabs Ola dont la réponse vient comme ceci:Comment puis-je obtenir la liste <Pojo1> qui est présent dans sa Pojo racine, qui renvoie également une liste <Pojo>
{
"categories": [
{
"id": "mini",
"display_name": "Mini",
"currency": "INR",
"distance_unit": "kilometre",
"time_unit": "minute",
"eta": 1,
"distance": "0.2",
"ride_later_enabled": "true",
"image": "http://d1foexe15giopy.cloudfront.net/mini.png",
"fare_breakup": [
{
"type": "flat_rate",
"minimum_distance": "4",
"minimum_time": "0",
"base_fare": "80",
"minimum_fare": "0",
"cost_per_distance": "10",
"waiting_cost_per_minute": "0",
"ride_cost_per_minute": "1",
"rates_higher_than_usual": false,
"surcharge": []
},
{
"type": "airport_rate",
"minimum_distance": "25",
"minimum_time": "0",
"base_fare": "499",
"minimum_fare": "0",
"cost_per_distance": "13",
"waiting_cost_per_minute": "0",
"ride_cost_per_minute": "1",
"rates_higher_than_usual": false,
"surcharge": []
}
],
"cancellation_policy": {
"cancellation_charge": 50,
"currency": "INR",
"cancellation_charge_applies_after_time": 5,
"time_unit": "minute"
}
}
],
"ride_estimate": {}
}
J'ai créé le modèle classes comme:
public class ListOfEstimateTimeForOla() {
List<Categories> categories;
//getter of categories
}
Au-dessus de la classe est le POJO principal où j'obtiens toute la réponse. Ci-dessous donné un autre POJO nommé - Catégories.
public class Categories() {
List<Fare_breakup>;
//getter of Fare_breakup
}
et il y a un modèle défini comme Fare_breakup qui est comme ceci:
public class Fare_breakup {
int base_fare;
//getter of fare
}
Maintenant, je reçois la réponse dans mon fragment, dont le code est comme ci-dessous:
requestInterface = retrofit.create(RideRequestInterface.class);
if (pickup_lat != 0 && pickup_long != 0) {
Call<ListOfEstimateTimeForOla> priceData = requestInterface.getEstimateTimeForOla(pickup_lat, pickup_long);
priceData.enqueue(new Callback<ListOfEstimateTimeForOla>() {
@Override
public void onResponse(@NonNull Call<ListOfEstimateTimeForOla> call, @NonNull Response<ListOfEstimateTimeForOla> response) {
int statusCode = response.code();
ListOfEstimateTimeForOla data = response.body();
assert data != null;
EstimateTimeAdapterForOla adapter = new EstimateTimeAdapterForOla(data.getCategories(), getContext());
estimatePriceForOla.setAdapter(adapter);
progressForOla.setVisibility(View.GONE);
estimatePriceForOla.setVisibility(View.VISIBLE);
Log.d("Estimated Time for Ola", "onResponse: "+ statusCode);
}
@Override
public void onFailure(@NonNull Call<ListOfEstimateTimeForOla> call, @NonNull Throwable t) {
Log.d("Estimated Time for Ola", "onResponse: "+ t.getMessage());
}
});
}
I besoin d'obtenir le tarif dans mon RecyclerView dont la classe d'adaptateur est ci-dessous:
public class EstimateTimeAdapterForOla extends RecyclerView.Adapter<EstimateTimeAdapterForOla.EstimateTimeHolder>{
private Context c;
private List<EstimateTimeForOla> estimateTimeForOla;
public EstimateTimeAdapterForOla (List<EstimateTimeForOla> estimateTimeForOla, Context c) {
this.estimateTimeForOla = estimateTimeForOla;
this.c = c;
}
@Override
public EstimateTimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.estimate_time_for_ola, parent, false);
EstimateTimeHolder holder = new EstimateTimeHolder(view);
return holder;
}
@Override
public void onBindViewHolder(EstimateTimeHolder holder, int position) {
holder.displayName.setText(estimateTimeForOla.get(position).getDisplay_name());
Picasso.with(c).load(estimateTimeForOla.get(position).getImage()).into(holder.displayIcon);
holder.fare.setText(String.valueOf(estimateTimeForOla.get(position).getFare_breakup().get(0).getBase_fare()));
holder.eta.setText(String.valueOf(estimateTimeForOla.get(position).getEta()));
}
@Override
public int getItemCount() {
return estimateTimeForOla.size();
}
public static class EstimateTimeHolder extends RecyclerView.ViewHolder {
TextView displayName, fare, eta;
ImageView displayIcon;
public EstimateTimeHolder(View itemView) {
super(itemView);
displayName = itemView.findViewById(R.id.display_name_ola_tv);
fare = itemView.findViewById(R.id.actual_fare_tv);
eta = itemView.findViewById(R.id.actual_eta_tv);
displayIcon = itemView.findViewById(R.id.display_icon_ola_iv);
}
}
}
Maintenant, mon problème est comment obtenir le tarif dans mon recyclerview via onBindViewHolder?
Ci-dessous est donné l'erreur après l'exécution du code ci-dessus:
07-28 17:27:50.134 330-330/test.android.mobond.tabs.slidingtabs E/AndroidRuntime: FATAL EXCEPTION: main
Process: test.android.mobond.tabs.slidingtabs, PID: 330
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
at test.android.mobond.tabs.slidingtabs.adapters.EstimateTimeAdapterForOla.onBindViewHolder(EstimateTimeAdapterForOla.java:45)
at test.android.mobond.tabs.slidingtabs.adapters.EstimateTimeAdapterForOla.onBindViewHolder(EstimateTimeAdapterForOla.java:22)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6400)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6433)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5377)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5640)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5482)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5478)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2215)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1542)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1502)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3625)
at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3067)
at android.view.View.measure(View.java:18870)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.view.View.measure(View.java:18870)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1629)
at android.view.View.measure(View.java:18870)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:464)
at android.view.View.measure(View.java:18870)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
at android.view.View.measure(View.java:18870)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:721)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:612)
at android.view.View.measure(View.java:18870)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.view.View.measure(View.java:18870)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:721)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:612)
at android.view.View.measure(View.java:18870)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3076)
at android.view.View.measure(View.java:18870)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2392)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1416)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1661)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1301)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7016)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
at android.view.Choreographer.doCallbacks(Choreographer.java:590)
at android.view.Choreog
Est-ce que data.getCategories() vous renvoie la liste correcte? –
Il n'y a pas de propriété appelée «tarif» dans votre json. – SripadRaj
@AyushKhare, oui .. Il me renvoie la liste des catégories, qui contient la liste des Fare_breakup –