2016-08-31 5 views
0

Ich habe eine ViewPager mit einem FragmentPagerAdapter für die Anzeige von drei Registerkarten, jede vertreten durch seine ow-Fragment. Eines dieser Fragmente enthält eine Liste, die beim Wechseln/Wischen zu dieser Registerkarte aktualisiert werden sollte. Aber ich finde keinen Weg, das zu erreichen. Ich habe versucht, die onResume Methode zu verwenden, aber die Fragmente scheinen nicht angehalten zu werden und auf Registerkartenänderung fortgesetzt zu werden. Ich habe auch versucht ViewPager.OnPageChangeListener in meinem MainActivity mit:Aktualisierung ListView Fragment auf Viewpager Registerkarte ändert

@Override 
public void onPageSelected(int position) 
{ 
    FragmentRefreshInterface currentFragment = (FragmentRefreshInterface) mSectionsPagerAdapter.getItem(position); 
    currentFragment.onRefreshed(); 
} 

Und im Fragment verwende ich folgendes:

@Override 
public void onRefreshed() 
{ 
    List<Record> records = mRecordingService.getRecords(); 

    mRecordAdapter.clear(); 
    mRecordAdapter.add(record); 
} 

Aber mit diesem Code kann ich meine nicht RecordingService Klasse zuzugreifen, die verwendet wird, die zur Verfügung zu stellen Datenbankfunktionen (weil mRecordingService anscheinend null ist). Ich initialisieren es im Fragment wie folgt aus:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    mRecordingService = new RecordingService(getContext()); 
} 
+0

'Fragment' hat keine' onRefreshed() 'Methode. Mit welcher Schnittstelle implementieren Sie diese Methode? (Es würde viel helfen, den genauen Klassennamen zu zeigen, der jede Methode enthält, die Sie hier gezeigt haben.) –

+0

Was ist die Deklaration für 'mRecordAdapter'? –

+0

Was ist 'record'? Wo wird es erklärt? Ich sehe hier eine Variable namens "records", aber nicht "record". –

Antwort

1

die onPageChangeListener Verwendung ist die richtig wa y es zu tun. Ich glaube der Grund, warum Ihr Code nicht funktioniert, ist, weil Sie auf Ihrem Pager-Adapter getItem aufrufen: getItem() gibt tatsächlich eine neue Instanz des Fragments zurück. Um die aktuelle Instanz zu erhalten, verwenden Sie instantiateItem() (die einen Verweis auf das tatsächlich verwendete Fragment zurückgibt).

Code ändern so etwas wie folgt aussehen:

@Override 
public void onPageSelected(int position) 
{ 
    FragmentRefreshInterface currentFragment = (FragmentRefreshInterface) mSectionsPagerAdapter.instantiateItem(viewPager,position); 
    currentFragment.onRefreshed(); 
} 

Und sollte es funktionieren.

+1

Das ist, was ich gesucht habe :) –

+0

Ich denke nicht, 'onRefreshed()' direkt anzurufen ist die Lösung. Dies scheint eine Rückrufmethode zu sein, die von einer Schnittstelle implementiert wird.Natürlich würde das einfache Ändern des Namens dieser Methode in einen benutzerdefinierten Namen dieses Problem teilweise lösen. –

-1

In Ihrem MainActivity:

private FirstFragment firstFragment; 
private WantedFragment wantedFragment; 
private ThirdFragment thirdfragment; 

In getItem

switch(postition){ 
    //return first, wanted, third fragments depending on position 
} 

onPageSelected:

if(position == 1) // position of the wanted fragment 
wantedfragment.onRefreshed() 
+1

Nicht die Lösung, die ich erwartet habe, aber es funktioniert :-) Danke –

+0

Ich bin skeptisch über das direkte Aufruf einer Methode, die ein Rückruf sein scheint, vor allem wenn eine 'ListView' automatisch aktualisiert wird, wenn es korrekt implementiert ist. –

0

Ich schlage vor, dass der Code, den Sie in onRefreshed() haben, stattdessen in onResume() geht. Fragment hat keine onRefreshed() Methode. Sie müssen eine andere Schnittstelle implementieren, die diese Methode deklariert.

Da Sie Daten in einer Datenbank speichern, sollten Sie eine CursorAdapter oder Unterklasse wie SimpleCursorAdapter verwenden. Wenn Sie dies richtig machen, wird die ListView automatisch aktualisiert, wenn Sie einen Datensatz zur Datenbank hinzufügen. Dann kann der Dienst Datensätze hinzufügen, ohne auf den Service vom Fragment zugreifen zu müssen.

Verwandte Themen