2016-05-06 7 views
0

Ich versuche, die Daten zu meinem Adapter weitergegeben zu aktualisieren und somit Fragmente, deren Inhalt abhängig von diesen Daten zu aktualisieren,Kann nicht FragmentPagerAdapter machen Fragmente Inhalte zu aktualisieren

hier ist die Adpater:

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.support.v13.app.FragmentPagerAdapter; 
public class ScheduleFragment_Pager_adapter extends FragmentPagerAdapter { 

     private String CurrentSelectedYearID="",CurrentSelectedTermID=""; 

     public ScheduleFragment_Pager_adapter(FragmentManager fm , String SelectedYearID , String SelectedTermID) { 
      super(fm); 
      CurrentSelectedYearID = SelectedYearID; 
      CurrentSelectedTermID = SelectedTermID; 
     } 

     @Override 
     public Fragment getItem(int position) { 

      Bundle bundle = new Bundle(); 
      bundle.putString("CurrentSelectedYearID", CurrentSelectedYearID); 
      bundle.putString("CurrentSelectedTermID",CurrentSelectedTermID); 

      if(position==0) 
      { 
       ClassesFragment classesFragment = new ClassesFragment(); 
       classesFragment.setArguments(bundle); 
       return classesFragment; 
      } 
      else if(position==1) 
      { 
       ExamsFragment examsFragment = new ExamsFragment(); 
       examsFragment.setArguments(bundle); 
       return examsFragment; 
      } 

      return null; 
     } 

     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "Classes"; 
       case 1: 
        return "Exams"; 
      } 
      return null; 
     } 
    } 

Ich habe versucht, diese answer zu verwenden, aber es hat nicht funktioniert, oder ich konnte es nicht verstehen!

und hier, wie ich den Adapter verwende und wie ich versuche, es zu aktualisieren.

bei onCreateView ein Haupt Fragmente [I mit verschachteltem Fragmente arbeitete]

mViewPager.setAdapter(new ScheduleFragment_Pager_adapter(getChildFragmentManager(), mSelectedYearID, mSelectedTermID)); 

und ich aktualisieren Sie die Adapter wie diese

@Override  
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(requestCode == 0){ 
      if(resultCode == Activity.RESULT_OK){ 
       mSelectedTermID = data.getStringExtra("mSelectedTermID"); 
       mSelectedYearID = data.getStringExtra("mSelectedYearID"); 
       mViewPager.getAdapter().notifyDataSetChanged(); 
      } 
     } 
    } 

Wo die onActivityResult ist, wo mSelectedTermID und mSelectedYearID werden aktualisiert.

Hilfe?

+0

Wie übergeben Sie mSelectedTermID und mSelectedYearID an Ihren Adapter? Ich sehe, Sie übergeben sie an den Konstruktor, aber später Adapter zu aktualisieren, wie liefern Sie sie? –

+0

@temna_nich, 'mSelectedTermID',' mselectedYearID 'sind globale Variablen, bevor ich' setAdapter' bei 'onCreateView' aufruft. Ich gebe ihnen Werte, das macht den Adapter gut, dann könnten diese Werte bei' onActivityResult' geändert werden Überhole sie nicht wieder - sollte ich sie noch einmal weitergeben? ,,, Was verlangst du? –

+0

Fügen Sie eine Protokollnachricht oder einen Haltepunkt hinzu und überprüfen Sie 'mViewPager.getAdapter(). NotifyDataSetChanged();' wurde aufgerufen. –

Antwort

1

make Adapter Klassenvariable in Fragment

private ScheduleFragment_Pager_adapter adapter; 

onCreateView eines Haupt Fragment

adapter = new ScheduleFragment_Pager_adapter(getChildFragmentManager(), mSelectedYearID, mSelectedTermID) 
mViewPager.setAdapter(adapter); 

in Ihrem Adapter

public void setValues(String SelectedYearID , String SelectedTermID) { 
     CurrentSelectedYearID = SelectedYearID; 
     CurrentSelectedTermID = SelectedTermID; 
    } 

onActivityResult

adapter.setValues(mSelectedTermID, mSelectedYearID); 
    adapter.notifyDataSetChanged(); 
+0

Natürlich schreibe ich, das ist genau das, was ich mit Ihrem Rat der Weitergabe der Daten getan habe. Vielen Dank –

+0

Funktioniert es jetzt? –

+0

Ja, ich habe 'FragmentStatePagerAdapter' anstelle von' FragmentPagerAdapter' verwendet und 'GetItemPosition' überschrieben, wobei' POSITION_NONE' immer zurückgegeben wurde und die Daten erneut an den Adapater übergeben wurden und es funktionierte –

1

Versuchen FragmentStatePagerAdapter

Explained here

+0

Ich habe versucht, aber nichts anderes passiert, immer noch nicht aktualisiert –

+0

Diese Adapter werden für verschiedene Zwecke verwendet. Die Auswahl hängt von der Anzahl der Seiten ab, wie groß die Ansicht ist. –

0

FragmentPagerAdapter speichert alle Fragmente jeder Seite der Benutzer besucht zu verwenden.

Durch die Rückgabe von POSITION_NONE und jeden Aufruf sollte der notifyDataSetChanged() Adapter das zwischengespeicherte Fragment löschen und ein neues erstellen.

Haben Sie überprüft, ob notifyDataSetChanged() aufgerufen wurde?

Beachten Sie, indem Sie POSITION_NONE verlieren Sie Cache-Mechanismus verlieren und für große Ansichten, mehrere Seiten kann es ein Problem sein.

Sie können Beobachtermuster implementieren - erstellen Sie die erstellten Fragmente und rufen Sie sie zurück, wenn ein Update erforderlich ist.

+0

'FragmentStatePagerAdapter' funktionierte gut für mich, aber ich habe' getItemPosition' implementiert, um immer 'POSITION_NONE' zu implementieren, aber gibt es noch einen anderen effizienten Weg es zu implementieren? –

+0

Beobachtermuster [Beispiel] (https://github.com/mgolochov/dodroid/blob/36ca89506657f744945f16838fc4ecab65827b8f/app/src/main/java/doit/study/droid/QuestionsPagerAdapter.java) mit FragmentStatePagerAdapter, aber die Idee ist gleich. –

+0

Das ist etwas wie zu mir –

Verwandte Themen