3

Ich verwendete die Recycler-Ansicht, um meine Liste der Daten anzuzeigen. Ich rief Web-Service und bekomme die Daten vom Server und aktualisiere aktuelle ArrayList mit Serverdaten. So fülle ich die Daten in meiner aktuellen ArrayList.Problem mit Aktualisierungsdaten von notifyDataSetChanged in RecyclerView

mAlUotesDatas.clear(); 
mAlUotesDatas = (ArrayList<BillBoardData>) webservice.data; 
mUotesAdaptor.notifyDataSetChanged(); 

und gelten notifyDataSetChanged() in der Liste der Daten zu reflektieren, aber es die Liste nicht reflektieren. In mAlUotesDatas werden die aktualisierten Daten angezeigt, aber die aktualisierte Liste der Daten wird nicht angezeigt.

Danach habe ich ändern es wie

mAlUotesDatas.clear(); 
mAlUotesDatas.addAll(res.data); 
mUotesAdaptor.notifyDataSetChanged(); 

Dies funktioniert gut. Es war überraschend für mich, wie das funktioniert ??, obwohl beide die aktualisierten Daten nach Web-Service-Aufruf haben.

Kann mir jemand helfen zu verstehen, wie das sein kann.?

Das ist meine Klasse.

package com.mimran.aphorismus.models; 

import android.os.Bundle; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.mimran.aphorismus.R; 
import com.mimran.aphorismus.adapters.QuotesAdaptor; 

import java.util.ArrayList; 

public class DataFragment extends Fragment { 

private RecyclerView mRcvQuotes; 
private QuotesAdaptor mUotesAdaptor; 
private ArrayList<BillBoardData> mAlUotesDatas; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    mRcvQuotes = (RecyclerView) links(R.id.rcv_quotes); 
    mUotesAdaptor = new QuotesAdaptor(mContext, mAlUotesDatas); 
    mRcvQuotes.setAdapter(mUotesAdaptor); 

    return inflater.inflate(R.layout.my_view, container, false); 
} 

public void webserviceCall() { 
    public void onResponse() 
    { 
     if (response.isSuccess()) { 
      mAlUotesDatas.clear(); 
      //mAlUotesDatas = (ArrayList<BillBoardData>) res.data; 
      mAlUotesDatas.addAll(res.data); 
      mUotesAdaptor.notifyDataSetChanged(); 
     } 
    } 

} 
} 
+0

Akzeptieren Sie die Antwort, wenn es hilfreich war, bitte :) – mklimek

Antwort

2

Es funktioniert nicht, weil Sie keine Elemente zur richtigen Instanz der Datensammlung hinzufügen.

Adapter wird in einem Konstruktor mit der spezifischen Instanz der Datensammlung initialisiert und es arbeitet ständig daran.

Danach:

mAlUotesDatas = (ArrayList<BillBoardData>) webservice.data; 

mAlUotesDatas ist ein Verweis auf andere Sammlung als Adapter ‚s-Instanz.

Dann:

mUotesAdaptor.notifyDataSetChanged(); 

tatsächlich benachrichtigen Adapter über Änderungen in "alten" Datensammlung, die sich nicht geändert hat. Wenn Sie clear und addAll verwenden, funktioniert es, weil Sie mit derselben Instanz arbeiten und Elemente darin ersetzen.