# Probleme mit ViewPager und Activity



## JUserToto (19. Feb 2015)

Hallo zusammen,

ich habe eine Activity, die einen Viewpager mit 3 Fragments enthält. 
Das 2. Fragment (Also die mittlere Seite des Viewpagers) enthält eine Liste, die sich bei jedem Swipen (also Seitenwechsel) aktualisieren soll. 

Das hier ist die getItem Methode des PagerAdapters:

```
@Override
public Fragment getItem(int pos) {
	if (pos == 1) {
		listFragment = new ListFragment();
		return listFragment;
	} 
}
```

Dem Viewpager wurde ein Listener hinzugefügt:


```
vp.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
			@Override
			public void onPageSelected(int position) {
				System.out.println("listFragment null: "
						+ (listFragment == null));
	
				if (listFragment != null) {
					listFragment.updateList();
				} 
			}
});
```

Mein Problem ist nun: Das funktioniert in 99% der Fälle. Lege ich das Handy aber mal einige Stunden bei Seite und öffne die App wieder, funktioniert es plötzlich nicht mehr. Das listFragment ist "null", obwohl der ViewPager immernoch korrekt dargestellt wird. Die Liste wird einfach nicht aktualisiert (ist aber immernoch zu sehen, wie kann sie dann null sein?).

Ich kann diesen Fehler nicht einmal rekonstruieren, da ich nicht weiß, wann genau das ganze geschieht. 

Hat jemand eine Idee? 

lg Toto


----------



## dzim (23. Feb 2015)

Hm... Bin mir bei der Problematik einfach nicht sicher. Überlege schon eine ganze Weile, was ich da schreiben könnte.

Vielleicht erst einmal ein paar Tipps vorab:

```
if (pos == 1) {
	listFragment = new ListFragment();
	return listFragment;
}
```
Würde ich nicht machen: Jedes mal, wenn dein Adapter angefragt wird, erstellt er eine neue Instanz des Fragments.
Ich halte in meinem Adapter immer eine Liste und in der *#getItem*-Methode frage ich nur das Fragment an der Position aus der Liste ab.

Zweite Sache: Ist dein ViewPager in einem Fragment? Was ich meine: Sind deine Fragmente des ViewPagers wiederum Teil eines Eltern-Fragments? Wenn ja: Verwende in jedem Fall den childFragmentManager und nicht den "normalen" - das hat mir schon Probleme (Null-Pointer ) beschert.

Such das Fragment einmal über den besagten childFragmentManager:
Dazu musst du *FragmentManager#findFragmentByTag(String tagId)* nutzen. Das Format des Tags ist "android:switcher:%d:%d"
Das erste %d muss durch die ResourceId deines ViewPagers ersetzt werden, das zweite %d mit dem Index (oder der ID) des zu suchenden Fragments.
Bsp: Android getting fragment that is in FragmentPagerAdapter - Stack Overflow
Es gibt aber auch Bedenken, diesem Ansatz gegenüber:
Is it safe to use the TAG `android:switcher: + R.id.ot_pag_main + :0` to find a fragment? - Stack Overflow
Ich fahre aber eigentlich gut mit dem Ansatz!


----------

