Android Probleme mit ViewPager?

bruce85

Bekanntes Mitglied
Hallo,
ich hab da ein Problem mit dem ViewPager und zwar, wenn ich mindestens 2 Seiten weiter blätter, dann gehen die Variablen von den Seiten davor, verloren.

In MainActivity->OnCreate habe ich die Fragmente so erstellt:
Java:
aFragment = new AFragment();
bFragment = new BFragment();
cFragment = new CFragment();
dFragment = new DFragment();

z.B. in AFragment->onCreateView habe ich eine ListView und diese wird immer wieder neu geladen, wenn ich paar Seiten wechsel und wieder zurückkehre, also onCreateView wird dann immer ausgeführt:
Java:
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, container, false);
        
        listView = (ListView) view.findViewById(R.id.listView);
        rowItems = new ArrayList<RowItem>();
        customBaseAdapter = new CustomBaseAdapter(MainActivity.getActivity(), rowItems);
        listView.setAdapter(customBaseAdapter);
        return view;
    }

in MainActivity gebe ich die einzelnen Fragmente zurück:
Java:
public class MyPagerAdapter extends FragmentPagerAdapter {

		private final String[] TITLES = { "A", "B", "C", "D" };

		public MyPagerAdapter(FragmentManager fm) {
			super(fm);
		}

		@Override
		public CharSequence getPageTitle(int position) {
			return TITLES[position];
		}

		@Override
		public int getCount() {
			return TITLES.length;
		}

		@Override
		public Fragment getItem(int position) {
			switch (position) {
            case 0:
                return aFragment;
            case 1:
                return bFragment;
            case 2:
                return cFragment;
            case 3:
                return dFragment;
            default:
                return null;
            }
		}
	}

Wie könnte ich das Problem denn lösen?

Ich danbke euch schonmal für die Hilfe.

MfG
 
Der ViewPager lädt immer nur die Fragmente "links" und "rechts" vom gerade aktuellen. Alle davor/dahinter werden beendet. Du kannst aber die Daten aber gern "zwischenspeichern" und beim wieder Anzeigen eintragen, etc.

Fragments | Android Developers

Zum Speichern: #onSaveInstanceState(Bundle outState)
Zum wiederherstellen: #onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
 
Vielen Dank.

Ich hab das versucht, aber onSaveInstanceState wird nie ausgeführt, wenn ich ein Paar Page weiter blätter und wieder zurückkehre.
Java:
@Override
    public void onSaveInstanceState(Bundle outState) {
    	super.onSaveInstanceState(outState);
    	Toast.makeText(MainActivity.getActivity(), "Test", Toast.LENGTH_LONG).show();
    	outState.putString("test", test);
    }

Java:
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_search, container, false);
        
        if (savedInstanceState != null) {
        	String test = savedInstanceState.getString("test");
        }
        
        return view;
    }

woran könnte das denn liegen?

Gruss
 
Es dürfte funktionieren, wenn du den super Aufruf ans ende der Methode setzt, da in ihm letztendlich das Bundle gespeichert wird. Änderst du nach dem Aufruf Dinge im bundle werden die nicht gespeichert.
 
Das funktioniert auch nicht.

Liegt es Vielleicht daran, das ich die Klassen von den Fragmenten in der MainActivity->onCreate erstelle und diese dann so zurückgebe?
Java:
public class MyPagerAdapter extends FragmentPagerAdapter {

		private final String[] TITLES = { "A", "B", "C", "D" };

		public MyPagerAdapter(FragmentManager fm) {
			super(fm);
		}

		@Override
		public CharSequence getPageTitle(int position) {
			return TITLES[position];
		}

		@Override
		public int getCount() {
			return TITLES.length;
		}

		@Override
		public Fragment getItem(int position) {
			switch (position) {
            case 0:
            	return aFragment;
            case 1:
                return bFragment;
            case 2:
            	return cFragment;
            case 3:
                return dFragment;
            default:
                return null;
            }
			//return SuperAwesomeCardFragment.newInstance(position);
		}
	}
und die nicht so z.B. immer wieder neu erstelle?
Java:
case 0:
    return new AFragment();

Da ich bei den Fragmente "Methoden" drin habe, von dem ich aus der MainActivity zugreifen möchte, habe ich die Fragmente in der MainActivity->onCreate erstellt und die Instanzen von den Fragmenten, gebe ich dann so z.B. zurfück:
Java:
case 0:
    return aFragment;

Nur irgendwie wird "onSaveInstanceState" nie aufgerufen, bei den Fragmenten.

Muss ich Vielleicht bei den Fragmenten "onCreate" noch etwas aktivieren oder hinzufügen?

Gruss
 
Zuletzt bearbeitet:
Ich hab das jetzt anders gelöst.

Ich habe ein neuer Instanz von Bundle erzeugt und die Methode "onSaveInstanceState(Bundle outState)" rufe ich dann manuel auf und speichere die Daten.

Im onCreateView lese ich dann, von der neu erzeugten Instanz von Bundle, die werte wieder aus.

Klappt einwandfrei und vielen Dank für die Hilfe.

MfG
 

Neue Themen


Zurück
Oben