2016-07-10 18 views
0

Ich bin nicht in der Lage, die funktionierende Lösung für dieses Problem zu finden, und ich weiß nicht, wie das Problem richtig zu formulieren. Ich verwende OpenWeather API, um Prognosen für die nächsten sieben Tage zu bekommen eine separate Klasse für alle netzwerkbezogenen Arbeiten und Speichern des Ergebnisses in der sqlite-Datenbank und anschließendes Anhängen der Ergebniszeichenfolge an die Recycleransicht. Ich habe Retrofit verwendet, um meine HTTP-API in eine Java-Schnittstelle umzuwandeln. Ich habe den Recycleransichtsadapter an diese Klasse übergeben Konstruktor von meinem MainFragment class.I ist in der Lage, korrekt Daten aus der api zu erhalten, aber der folgende Code funktioniert nicht richtigRecyclerView Adapter nicht in der Lage, alle Elemente zu löschen

@Override 
    public void onResponse(Call<OpenWeather> call, Response<OpenWeather> response) { 
     int code = response.code(); 
     if (code == 200) { 
      OpenWeather openWeather = response.body(); 
      String []result = getWeatherDataFromRetrofit(openWeather,postal); 
      if (mForecastAdapter != null) { 
       Log.e(LOG_TAG,""+mForecastAdapter.getItemCount()); 
       for(int i=0;i<mForecastAdapter.getItemCount();i++){ 
        mForecastAdapter.remove(i); 
       } 
       for(int i=0;i<result.length;i++) { 
        String dayForecastStr = result[i]; 
        mForecastAdapter.add(i,dayForecastStr); 
       } 
       // New data is back from the server. Hooray! 

      } 

     } else { 
      Toast.makeText(mContext, "Did not work: " + String.valueOf(code), Toast.LENGTH_LONG).show(); 
     } 
    } 

Diese Funktion asynchron in retrofit.The f aufgerufen wird oder Schleife, die zum Entfernen von Elementen in mForecastAdapter verwendet wird, läuft nicht vollständig, die die Liste verursacht das doppelte Element

Heres das Entfernen enthalten und fügen Funktion i verwendet Recycler anzeigen Adapter

public void add(int position, String item) { 
     mDataset.add(position, item); 
     Log.e("Add element:", item); 
     notifyItemInserted(position); 
    } 

    public void remove(int position) { 
     Log.e("Remove element:",mDataset.get(position)); 
     mDataset.remove(position); 
     notifyItemRemoved(position); 
    } 

Es folgt die Log Eintrag, dass die for-Schleife ist i zeigt zum Löschen des mForecastAdapter bin mit nicht vollständig

läuft Wenn App

E/FetchWeatherTask: 0 
E/Add element:: Sun, Jul 10 - Rain - 35/27 
E/Add element:: Mon, Jul 11 - Rain - 32/27 
E/Add element:: Tue, Jul 12 - Rain - 32/27 
E/Add element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Thu, Jul 14 - Rain - 32/26 
E/Add element:: Fri, Jul 15 - Rain - 33/27 
E/Add element:: Sat, Jul 16 - Rain - 32/27 
beginnt

Wenn ich die App erstmals

E/FetchWeatherTask: 7 
E/Remove element:: Sun, Jul 10 - Rain - 35/27 
E/Remove element:: Tue, Jul 12 - Rain - 32/27 
E/Remove element:: Thu, Jul 14 - Rain - 32/26 
E/Remove element:: Sat, Jul 16 - Rain - 32/27 
E/Add element:: Sun, Jul 10 - Rain - 35/27 
E/Add element:: Mon, Jul 11 - Rain - 32/27 
E/Add element:: Tue, Jul 12 - Rain - 32/27 
E/Add element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Thu, Jul 14 - Rain - 32/26 
E/Add element:: Fri, Jul 15 - Rain - 33/27 
E/Add element:: Sat, Jul 16 - Rain - 32/27 

aktualisieren Wenn ich

E/FetchWeatherTask: 10 
E/Remove element:: Sun, Jul 10 - Rain - 35/27 
E/Remove element:: Tue, Jul 12 - Rain - 32/27 
E/Remove element:: Thu, Jul 14 - Rain - 32/26 
E/Remove element:: Sat, Jul 16 - Rain - 32/27 
E/Remove element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Sun, Jul 10 - Rain - 35/27 
E/Add element:: Mon, Jul 11 - Rain - 32/27 
E/Add element:: Tue, Jul 12 - Rain - 32/27 
E/Add element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Thu, Jul 14 - Rain - 32/26 
E/Add element:: Fri, Jul 15 - Rain - 33/27 
E/Add element:: Sat, Jul 16 - Rain - 32/27 

Ich bin nicht in der Lage zu verstehen, warum die Schleife die App für zweites Mal

frischt für zum Entfernen von Element verwendet wird, nicht richtig funktioniert .Thanks in fortgeschrittenen

Lösung: -

int count = mForecastAdapter.getItemCount() 
for(int i=0;i<count;i++){ 
        mForecastAdapter.remove(i); 
       } 

Oder ich kann in der remove()

public void remove() { 
      mDataset.clear(); 
      notifyItemRemoved(position); 
     } 
+0

können Sie versuchen, statt notifyItemRemoved notifyDataSetChanged bitte? – Swag

+1

Wie wäre es mit 'int i = mForecastAdapter.getItemCount() - 1; i> = 0; i -' beim Entfernen von Daten. Oder rufe einfach alle Gegenstände ab. – LordRaydenMK

+0

Das scheint seltsam, aber mehr von dem Code, den Sie geschrieben haben, wird benötigt, um das Problem zu finden, vielleicht können Sie einfach versuchen, "clear" zu verwenden, um das Array zu leeren und einfach Ihre add-Funktion verwenden und den Aufruf notifydatasetchanged wenn getan?Oder versuchen Sie zu debuggen, ob das Element tatsächlich gelöscht wird. – Roee

Antwort

0

Ihr Problem ist hier die Liste in einem Rutsch löschen:

for(int i=0;i<mForecastAdapter.getItemCount();i++){ 
    mForecastAdapter.remove(i); 
} 

Grundsätzlich mForecastAdapter.getItemCount() gibt eine andere Größe jede Iteration Ihrer for-Schleife, da Sie sind Gegenstände entfernen und seine Größe ändern. Das bedeutet, dass Sie für 10 Elemente sowohl i erhöhen als auch verringern, indem Sie Ihre Schleife so oft ausführen, wie Sie möchten.

Zweites Problem: Sie löschen das Element ith jede Iteration, aber Listen in Java neu indizieren, wenn Sie Elemente entfernen.

Try this:

int count = mForecastAdapter.getItemCount(); 
for (int i = 0; i < count; ++i) { 
    mForecastAdapter.remove(0); 
} 
+0

ohh danke Thomas und auch ich denke, die remove-Funktion zu ändern, so dass ich die Liste direkt löschen kann statt Schleifen –

Verwandte Themen