2017-03-07 1 views
0

Ich habe eine Arraylist erstellt, um Daten zu speichern, die von einem Webservice abgerufen werden.Daten werden nach jeder Iteration abgerufen, aber nur das letzte Element wird in Arraylist angezeigt. Ich habe verschiedene Lösungen ausprobiert, aber keine von ihnen scheinen hilfreich in meinem FallArraylist zeigt immer das letzte Element n mal

 public void onResponse(JSONObject paramAnonymousJSONObject) 
     { 
    JSONObject localJSONObject; 
    int j; 
    try 
    { 
     localJSONObject = paramAnonymousJSONObject.getJSONObject("status"); 
     j = localJSONObject.getInt("code"); 
     if (j == 200) { 
     JSONArray carModelArray = paramAnonymousJSONObject.getJSONArray("carModels"); 
     for (int i = 0; i <= carModelArray.length(); i++) { 
      JSONObject tariffResponse = null; 
      JSONObject tariff = carModelArray.getJSONObject(i); 
      try { 
      carId = tariff.getString("id"); 
      segment = tariff.getString("segment"); 
      imageURL = tariff.getString("imageURL"); 
      tariffResponse = tariff.getJSONObject("tariffResponse"); 
      CarType = tariffResponse.getString("carModel"); 
      weekdayTariff = tariffResponse.getString("weekdayTariff"); 
      weekendTariff = tariffResponse.getString("weekendTariff"); 
      peakSeasonTariff = tariffResponse.getString("peakSeasonTariff"); 
      maintenanceCharge = tariffResponse.getString("maintainanceFee"); 
      securityDeposite = tariffResponse.getString("securityDeposite"); 
      ArrayList arrayList = TariffActivity.this.tariffModelsList; 
      arrayList.add(new TariffModel(carId, CarType, imageURL, "\u20b9 " + weekdayTariff, "\u20b9 " + weekendTariff, "\u20b9 " + peakSeasonTariff, "\u20b9 " + securityDeposite, segment, "\u20b9 " + maintenanceCharge)); 
      TariffActivity.this.tariffAdapter = new TariffAdapter(TariffActivity.this.mContext,arrayList); 
      TariffActivity.this.mRecyclerView.setAdapter(tariffAdapter); 
      } catch (JSONException e) { 
      e.printStackTrace(); 
      } 

     } 
+0

Willkommen bei Stack Overflow! Es sieht so aus, als müssten Sie lernen, einen Debugger zu verwenden. Bitte helfen Sie sich selbst [https://ericlippert.com/2014/03/05/how-to-debug-small-programs/].Wenn Sie danach noch Probleme haben, können Sie gerne weitere Einzelheiten erfahren. –

+0

Wenn Sie Retrofit + Gson verwenden, müssten Sie Ihren JSON –

+0

@shivadeep nicht manuell parsen, TrafficAdapter wird an falscher Stelle gesetzt, da er innerhalb der Schleife liegt - der Wert wird überschrieben und der letzte Wert der Arraylist wird auf gesetzt es. Also müssen Sie die Arraylist dem Traffic-Adapter zuweisen, nachdem die Schleife endet, überprüfen Sie bitte meine Antwort unter –

Antwort

1

Erklären Sie dies außerhalb der Schleife.

ArrayList arrayList = TariffActivity.this.tariffModelsList; 

Und diese auch außerhalb der Schleife:

TariffActivity.this.tariffAdapter = new TariffAdapter(TariffActivity.this.mContext,arrayList); 
TariffActivity.this.mRecyclerView.setAdapter(tariffAdapter); 

Und die obige Zeile aus der Schleife entfernen. Da eine neue ArrayList generiert und neue Adapter für jede Iteration festgelegt wird.

Hoffe, das hilft.

+0

hat es nicht funktioniert – shivadeep

+0

Diese Neuzuweisung scheint sinnlos –

+0

@shivadeep Haben Sie ArrayList entfernt ArrayList = TariffActivity.this.tariffModelsList; das von innerhalb der Schleife? – tahsinRupam

1

tun Sie etwas wie unten.

public void onResponse(JSONObject paramAnonymousJSONObject) 
    { 
     JSONObject localJSONObject; 
     int j; 
     try 
     { 
      localJSONObject = paramAnonymousJSONObject.getJSONObject("status"); 
      j = localJSONObject.getInt("code"); 
      if (j == 200) { 
       JSONArray carModelArray = paramAnonymousJSONObject.getJSONArray("carModels"); 
       ArrayList arrayList = TariffActivity.this.tariffModelsList; 
       for (int i = 0; i <= carModelArray.length(); i++) { 
        JSONObject tariffResponse = null; 
        JSONObject tariff = carModelArray.getJSONObject(i); 
        try { 
         carId = tariff.getString("id"); 
         segment = tariff.getString("segment"); 
         imageURL = tariff.getString("imageURL"); 
         tariffResponse = tariff.getJSONObject("tariffResponse"); 
         CarType = tariffResponse.getString("carModel"); 
         weekdayTariff = tariffResponse.getString("weekdayTariff"); 
         weekendTariff = tariffResponse.getString("weekendTariff"); 
         peakSeasonTariff = tariffResponse.getString("peakSeasonTariff"); 
         maintenanceCharge = tariffResponse.getString("maintainanceFee"); 
         securityDeposite = tariffResponse.getString("securityDeposite"); 

         arrayList.add(new TariffModel(carId, CarType, imageURL, "\u20b9 " + weekdayTariff, "\u20b9 " + weekendTariff, "\u20b9 " + peakSeasonTariff, "\u20b9 " + securityDeposite, segment, "\u20b9 " + maintenanceCharge)); 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
       TariffActivity.this.tariffAdapter = new TariffAdapter(TariffActivity.this.mContext,arrayList); 
       TariffActivity.this.mRecyclerView.setAdapter(tariffAdapter); 

Sie haben außerhalb der for loopArrayList Zuordnung zu schreiben, denn wenn man innen in Schleife schreibt sie dann jedes Mal Neuinitialisierung so Element, das Sie hinzufügen müssen klar nach der Neuinitialisierung ist. Deshalb haben Sie nur den letzten Eintrag in der Liste.

+0

Willkommen bei Stack Overflow! Während Sie das Problem dieses Benutzers möglicherweise gelöst haben, sind Code-Only-Antworten für Benutzer, die in Zukunft auf diese Frage kommen, nicht sehr hilfreich. Bitte bearbeiten Sie Ihre Antwort, um zu erklären, warum Ihr Code das ursprüngliche Problem löst. –

+0

@JoeC: Ich habe die Erklärung hinzugefügt. –

0

Verschieben Sie die setAdapter() aus der for-Schleife und definieren Sie die arrayList Variable außerhalb der Schleife.

+0

tat, dass es nicht funktioniert – shivadeep

0

Sie Adapter in For-Schleife gesetzt haben auch Sie sind List jedes von Ihrem Activity bekommen, während Ruinieren Schleife:

Verwenden Unten Code:

public void onResponse(JSONObject paramAnonymousJSONObject) { 
     JSONObject localJSONObject; 
     int j; 
     try { 
      localJSONObject = paramAnonymousJSONObject.getJSONObject("status"); 
      j = localJSONObject.getInt("code"); 
      if (j == 200) { 
       JSONArray carModelArray = paramAnonymousJSONObject.getJSONArray("carModels"); 
       ArrayList arrayList = TariffActivity.this.tariffModelsList; 
       for (int i = 0; i <= carModelArray.length(); i++) { 
        JSONObject tariffResponse = null; 
        JSONObject tariff = carModelArray.getJSONObject(i); 
        try { 
         carId = tariff.getString("id"); 
         segment = tariff.getString("segment"); 
         imageURL = tariff.getString("imageURL"); 
         tariffResponse = tariff.getJSONObject("tariffResponse"); 
         CarType = tariffResponse.getString("carModel"); 
         weekdayTariff = tariffResponse.getString("weekdayTariff"); 
         weekendTariff = tariffResponse.getString("weekendTariff"); 
         peakSeasonTariff = tariffResponse.getString("peakSeasonTariff"); 
         maintenanceCharge = tariffResponse.getString("maintainanceFee"); 
         securityDeposite = tariffResponse.getString("securityDeposite"); 

         arrayList.add(new TariffModel(carId, CarType, imageURL, "\u20b9 " + weekdayTariff, "\u20b9 " + weekendTariff, "\u20b9 " + peakSeasonTariff, "\u20b9 " + securityDeposite, segment, "\u20b9 " + maintenanceCharge)); 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
       TariffActivity.this.tariffAdapter = new TariffAdapter(TariffActivity.this.mContext, arrayList); 
       TariffActivity.this.mRecyclerView.setAdapter(tariffAdapter); 
      } 
     } 
    } 
0

Try this,

public void onResponse(JSONObject paramAnonymousJSONObject) 
      { 
     JSONObject localJSONObject; 
     int j; 
      ArrayList arrayList = TariffActivity.this.tariffModelsList; 

     try 
     { 
      localJSONObject = paramAnonymousJSONObject.getJSONObject("status"); 
      j = localJSONObject.getInt("code"); 
      if (j == 200) { 
      JSONArray carModelArray = paramAnonymousJSONObject.getJSONArray("carModels"); 
      for (int i = 0; i <= carModelArray.length(); i++) { 
       JSONObject tariffResponse = null; 
       JSONObject tariff = carModelArray.getJSONObject(i); 
       try { 
       carId = tariff.getString("id"); 
       segment = tariff.getString("segment"); 
       imageURL = tariff.getString("imageURL"); 
       tariffResponse = tariff.getJSONObject("tariffResponse"); 
       CarType = tariffResponse.getString("carModel"); 
       weekdayTariff = tariffResponse.getString("weekdayTariff"); 
       weekendTariff = tariffResponse.getString("weekendTariff"); 
       peakSeasonTariff = tariffResponse.getString("peakSeasonTariff"); 
       maintenanceCharge = tariffResponse.getString("maintainanceFee"); 
       securityDeposite = tariffResponse.getString("securityDeposite"); 

       arrayList.add(new TariffModel(carId, CarType, imageURL, "\u20b9 " + weekdayTariff, "\u20b9 " + weekendTariff, "\u20b9 " + peakSeasonTariff, "\u20b9 " + securityDeposite, segment, "\u20b9 " + maintenanceCharge)); 

       } catch (JSONException e) { 
       e.printStackTrace(); 
       } 
      } 
      } 
     } 
     catch (Exception e) { 
       e.printStackTrace(); 
       }  

       TariffActivity.this.tariffAdapter = new TariffAdapter(TariffActivity.this.mContext,arrayList); 
       TariffActivity.this.mRecyclerView.setAdapter(tariffAdapter); 
      } 
+0

@shivadeep stellen Sie Ihren Adapter nach for-Schleife – user2025187

+0

Willkommen zu Stack Overflow! Während Sie das Problem dieses Benutzers möglicherweise gelöst haben, sind Code-Only-Antworten für Benutzer, die in Zukunft auf diese Frage kommen, nicht sehr hilfreich. Bitte editiere deine Antwort, um zu erklären, warum dein Code das ursprüngliche Problem löst –

0

Sie müssen clear() die Arraylist vor der Schleife, sonst erhalten Sie doppelte Daten von onResponse in der Liste angezeigt.

Extrahieren Sie nur JSON-Daten und add() in die Liste innerhalb der Schleife. Wenn Sie noch Kopien von Daten, siehe Why does my ArrayList contain N copies of the last item added to the list?

Außerhalb die Schleife, Sie setAdapter()OR, Sie adapter.notifyDataSetChanged() vorausgesetzt, Sie haben bereits einige adapter nennen. Auch


, i <= carModelArray.length() wird eine Ausnahme ausgelöst, wenn getJSONObject(i) verwenden.
Wechsel zu i < carModelArray.length()

+0

Wenn ich clear() verwende bleibt nur eine Kopie – shivadeep

+0

Wie ich schon sagte, du musst vor der Schleife löschen. Als allererstes in 'onResponse'. Wenn Sie nur ein Element sehen, könnte Ihr JSON-Array nur ein Element haben. –

+0

es geht um Fehlerantwort – shivadeep

0

ArrayList arrayList = TarifAktivität.dieses.tariffModelsList;

platzieren Sie diese Zeile vor für Schleife

+0

hat es nicht funktioniert – shivadeep

+0

Legen Sie diese beiden Zeilen nach für und versuchen Sie: TariffActivity.this.tariffAdapter = new TariffAdapter (TariffActivity.this.mContext, arrayList); TarifActivity.this.mRecyclerView.setAdapter (tarifAdapter); –

+0

hat es nicht funktioniert – shivadeep

Verwandte Themen