2016-06-07 16 views
0

Ich habe eine ListView, die eine SwipeRefreshLayout implementiert hat. Was ich versuche zu tun ist, aktualisieren Sie die ListView, wenn der Benutzer nach unten wischt. Ich habe versucht, nach verschiedenen Optionen zu suchen, aber leider kann ich keine Lösung finden.Aktualisierung Listview auf Fragment

Wäre es besser, die Fragment oder die onCreate Funktion neu zu laden?

Hier ist mein Code

public class NewsTab extends Fragment implements OnRefreshListener{ 
final LinkedList<News> listnews = new LinkedList<News>(); 


public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.news_tab, container, false); 
     swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout); 
     swipeRefreshLayout.setOnRefreshListener(this); 

     newslist = (ListView) view.findViewById(R.id.displaynews); 

     populatelist(listnews); 
     adapter = new CustomAdapter(getActivity(),listnews); 
     newslist.setAdapter(adapter); 
     return view; 
} 

public void onRefresh() { 
    swipeRefreshLayout.setRefreshing(true); 
    new StartNewsLoad().execute(""); 
} 

private class StartNewsLoad extends AsyncTask<String, Void, String> { 
    //ProgressDialog pd = null; 
    protected String doInBackground(String... params) { 
     reloadNews(); 
     loadTopNews(); 
     //NewsTab.listnews = new LinkedList<News>(); 
     return null; 
    } 

    protected void onPostExecute(String result) { 
     adapter = new CustomAdapter(getActivity(),listnews); 
     adapter.notifyDataSetChanged(); 
     swipeRefreshLayout.setRefreshing(false); 
    } 
} 

/// ANTWORT

ich die Antwort gefunden! Ich fügte die folgende Codezeile in meinen Kostümadapter ein und nannte sie außerhalb als adapter.refresh();

public void refresh(LinkedList<News> newsList) 
    { 
     this.results = newsList; 
     notifyDataSetChanged(); 
    } 

Vielen Dank für Ihre Hilfe!

+1

Sie müssen den Adapter auf dem ListView setzen, bevor Sie ihn benachrichtigen –

+1

Davon abgesehen, woher kommt 'listnews'? Bitte zeigen Sie eine [mcve] –

+0

@ cricket_007 danke für Ihre Antwort listnews ist eine globale verknüpfte Liste, die ich erstellt habe, dass meine News-Klasse enthält siehe oben Bearbeiten – paul590

Antwort

1

Zunächst einmal keine Notwendigkeit, die Adapter wieder in onPostExecute() zu erstellen, wie Sie es bereits in onCreateView() .Sie einfachen Bedarf initialisiert den Adapter der Änderungen in dem „listnews“ zu informieren, wenn es changed.Make sicher, dass Ihre Liste ändert sich tatsächlich vor dem Aufruf der notifyDataSetChanged().

bitte auch Debugger verwenden, oder melden Sie sich überprüfen, ob Ihre onRefresh() genannt wird oder not.From die Art, wie ich sehe, soll es mit @Override Anmerkung außer Kraft gesetzt werden, wie es das Verfahren der Schnittstelle von Ihrem Fragmente (swipeRefreshLayout.setOnRefreshListener(this);) implementiert ist. es sollte wie sein:

@Override 
public void onRefresh() { 
    swipeRefreshLayout.setRefreshing(true); 
    new StartNewsLoad().execute(""); 
    } 
+0

Vielen Dank für Ihre Antwort, adapter = new CustomAdapter (getActivity(), listnews); Ich füge es so hinzu, um die neue Liste hinzuzufügen, gibt es einen Weg zu dem, was ich schon habe? – paul590

+0

@ paul590 Sie sind in Ordnung, wenn Sie den Adapter erstellen, aber wenn Sie die Listenansicht aktualisieren müssen, erstellen Sie sie nicht erneut oder setzen Sie sie erneut auf listview.Simple Call notifydatasetchanged, wenn sich die Daten in Ihrer Arraylist ändern. –

+0

danke für die Bereitstellung dieser Informationen Ich habe die listview.setadapter (adapter) -Linie entfernt und ket die notifydatasetchanged aber meine Liste wurde nicht mit den neuen Werten aktualisiert, ich testete die Werte wurden durch Scrollen auf eine andere Registerkarte, die die gleichen Informationen zieht hinzugefügt und die neuen waren tot, fehlt mir eine Commit-Zeile oder irgendetwas, das die Aktualisierung der Liste initiiert? – paul590

1

In onCreateView() Ihre Listview und swiperefereshLayout mit Hörer intialize und stellen sie Ihren Adapter an Ihren Listenansicht ähnlich --->

if(adapter==null&& listNews==null){ 
listnews=new ArrayList<object>(); 
adapter=new CustomAdapter(getActivity(),listnews); 
listView.setAdapter(adapter); 
adapter.notifyDataSetChanged();} 
else{ 
listView.setAdapter(adapter);} 

auf diese Weise damit umgehen auch Beibehalten der ListData onOrientationchange.

und Wenn Sie eine API-Antwort oder eine Listenansicht mit Wisch-Layout erhalten, erstellen Sie keinen neuen Adapter, fügen Sie einfach listNews zu Ihrem Adapter hinzu und rufen Sie adapter.notifyDataSetChanged();

+0

vielen dank für ihre antwort, wie würde ich über das hinzufügen an den adapter anstatt neu zu erstellen? – paul590

+0

Hallo, nachdem ich versucht habe, deine Empfehlung zu übernehmen, kann ich das Listenupdate immer noch nicht sehen. Ich habe die setadapter-Zeile entfernt und den adapter beibehalten = new CustomAdapter (getActivity(), listnews) und adapter.notifyDataSetChanged() aber kein Glück – paul590

+0

danke für ihre hilfe ich fand meine antwort siehe oben! – paul590