Wiedergabe der Itempostition im ViewPager

M

Manuel1805

Ambitioniertes Mitglied
2
Hallo zusammen,

ich versuche in einem ViewPager die Itemposition der aktuell aufgerufenen Seite zu speichern um beim erneuten Start dieses ViewPagers an dieser Seite zu beginnen statt am Anfang.

Meine Realisierung funktioniert leider nur Suboptimal :drool:
...d.h. es funktioniert nur wenn ich eine Seit zurück swipe/blätter

Ansonsten wird mir immer die akutelle Seite +2 angezeigt. Mir ist unverständlich wieso dieses Verhalten auftritt. Vielleicht kann mir jemand weiterhelfen.

Anbei der Code:
Code:
package de.manuel.buchenfueranfaenger;


public class SinnPageAdapter extends PagerAdapter {

	Context context;

	public SinnPageAdapter(Context context) {
		this.context = context;
              	}

		
	// Rückgabe der Seite zum Merken der aktuellen Position

	public int getSeite() {
		if (seite < 1) {
			return 0;
		} else if (seite < 46 && seite >0) {
			return this.seite;
		} else
			return 0;
	}

	TextView folienAnzahl;
	TextView folienDauer;
	TextView titel;
	TextView titelInhalt;
	TextView inhalt;
	TextView seite_von_bis;
	ImageView bild;
	ImageView imagePfeilrechts;
	CharSequence titelInhalttext; // für XML Titel_Inhalt
	CharSequence inhaltText; // für XML Inhalt

	private int seite;
	private int maxSeitenzahl = 36;
	TextView frage;

	

	// ---Die Anzahl aller Seiten zurückgeben---
	public int getCount() {
		return 46;
	}
	
	public Object instantiateItem(View collection, int position) {

		LayoutInflater inflater = (LayoutInflater) collection.getContext()
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

		int resId = 0;
		switch (position) {
		case 0:
			resId = R.layout.a_titel_inhalt_startseite;
			seite = 1;
			seitenToast();
			break;
		case 1:
			resId = R.layout.a_titel_inhalt;
			seite = 2;
			seitenToast();
			break;
		case 2:
			resId = R.layout.a_inhalt;
			seite = 3;
			seitenToast();
			break;
		case 3:
			resId = R.layout.a_inhalt;
			seite = 4;
			seitenToast();
			break;
		}

		View view = inflater.inflate(resId, null);

		if (seite == 1) {
			titel = (TextView) view.findViewById(R.id.a_tis_titel);
			titel.setText("Grundlagen");

			titelInhalt = (TextView) view.findViewById(R.id.a_tis_inhalt);
			titelInhalttext = Html
					.fromHtml("In dieser Lektion lernst Du"
							+ " die ersten Grundbegriffe und Aufgaben der Buchführung kennen. ");

			titelInhalt.setText(titelInhalttext);
			folienAnzahl = (TextView) view.findViewById(R.id.a_tis_folien_text);
			folienAnzahl.setText("36 Seiten");

			folienDauer = (TextView) view.findViewById(R.id.a_tis_zeit_text);
			folienDauer.setText("20 min.");

		} else if (seite == 2) {

			titel = (TextView) view.findViewById(R.id.a_ti_titel);
			titel.setText("1. Überblick");

			titelInhalt = (TextView) view.findViewById(R.id.a_ti_inhalt);
			titelInhalttext = Html
					.fromHtml("Die Buchführung verschafft dem Unternehmer, ");

			titelInhalt.setText(titelInhalttext);
			seite_von_bis = (TextView) view
					.findViewById(R.id.a_ti_seite_von_bis);
			seite_von_bis.setText("1 / " + maxSeitenzahl);

		} else if (seite == 3) {

			inhalt = (TextView) view.findViewById(R.id.a_i_inhalt);
			inhaltText = Html
					.fromHtml("Mit Hilfe der Buchführung wird der Gewinn oder Verlust ");

			inhalt.setText(inhaltText);
			seite_von_bis = (TextView) view
					.findViewById(R.id.a_i_inhalt_seite_von_bis);
			seite_von_bis.setText("2 / " + maxSeitenzahl);

		} else if (seite == 4) {

			inhalt = (TextView) view.findViewById(R.id.a_i_inhalt);
			inhaltText = Html
					.fromHtml(" Für uns ist das 3. Buch relevant. Dieses beschäftigt sich mit ");

			inhalt.setText(inhaltText);
			seite_von_bis = (TextView) view
					.findViewById(R.id.a_i_inhalt_seite_von_bis);
			seite_von_bis.setText("3 / " + maxSeitenzahl);

		}

		((ViewPager) collection).addView(view, 0);

		return view;

	}

	@Override
	public void destroyItem(View arg0, int arg1, Object arg2) {
		((ViewPager) arg0).removeView((View) arg2);
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == ((View) arg1);
	}

	@Override
	public Parcelable saveState() {
		return null;
	}

	
	public void richtigToast() {

	}

	public void falschToast() {

		
	}
	
	//TESTANZEIGE
	public void seitenToast() {

		final Toast ImageToast = new Toast(context);
		LinearLayout toastLayout = new LinearLayout(context);
		toastLayout.setOrientation(LinearLayout.HORIZONTAL);
		TextView text = new TextView(context);
		text.setText(String.valueOf(seite));
		toastLayout.addView(text);
		ImageToast.setView(toastLayout);
		ImageToast.setDuration(Toast.LENGTH_SHORT);
		ImageToast.show();
		
		// Toastlänge verkürzen
				Handler handler = new Handler();
				handler.postDelayed(new Runnable() {
					@Override
					public void run() {
						ImageToast.cancel();
					}
				}, 200);

	}

}

und...
Code:
package de.manuel.buchenfueranfaenger;

public class Sinn extends Fragment {

	public Sinn() {
   	}

	
	// Aktuelle Seite Variable
	private int sinnSeite;
       	
	public ViewPager viewPager;
	SinnPageAdapter adapter;
	
		
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.start_kapitel, container, false);
       		// ViewPager initialisieren
		adapter = new SinnPageAdapter(this.getActivity());
		viewPager = (ViewPager) view.findViewById(R.id.viewPager);
		viewPager.setAdapter(adapter);
		laden();
		anzeige();
		viewPager.setCurrentItem(sinnSeite);
		
		return view;
       	}
 	  
	@Override
	public void onResume() {
		
		// sinnSeite = adapter.getSeite();
		// this.speichern();
			super.onResume();
    	}

	public void onPause() {
		sinnSeite = adapter.getSeite();
		this.speichern();
		super.onPause();
     	}

	public void speichern() {
		SharedPreferences prefs = getActivity().getPreferences(
				Context.MODE_PRIVATE);
		SharedPreferences.Editor meinEditor = prefs.edit();
		meinEditor.putInt("sinnSeite", adapter.getSeite());
		meinEditor.apply();
		// meinEditor.commit();

    //  Test: Ausgabe der gespcherten Seite
		final Toast ImageToast = new Toast(this.getActivity());
		LinearLayout toastLayout = new LinearLayout(this.getActivity());
		toastLayout.setOrientation(LinearLayout.HORIZONTAL);
		ImageView image = new ImageView(this.getActivity());
		TextView text = new TextView(this.getActivity());
		image.setImageResource(R.drawable.ic_falsch);
		text.setText(String.valueOf(sinnSeite));
		toastLayout.addView(image);
		toastLayout.addView(text);
		ImageToast.setView(toastLayout);
		ImageToast.setDuration(Toast.LENGTH_SHORT);
		ImageToast.show();
     	}

	public void laden() {
		SharedPreferences prefs = getActivity().getPreferences(
				Context.MODE_PRIVATE);
		// SharedPreferences.Editor meinEditor = prefs.edit();
		this.sinnSeite = prefs.getInt("sinnSeite", 0);
    	}

  // Test der geladenen Seite
	public void anzeige() {
		final Toast ImageToast = new Toast(this.getActivity());
		LinearLayout toastLayout = new LinearLayout(this.getActivity());
		toastLayout.setOrientation(LinearLayout.HORIZONTAL);
		ImageView image = new ImageView(this.getActivity());
		TextView text = new TextView(this.getActivity());
		image.setImageResource(R.drawable.ic_richtig);
		text.setText(String.valueOf(sinnSeite));
		toastLayout.addView(image);
		toastLayout.addView(text);
		ImageToast.setView(toastLayout);
		ImageToast.setDuration(Toast.LENGTH_SHORT);
		ImageToast.show();
	}
     }
 
Deine Unverständlichkeit kann sich beheben lassen, wenn du dir mal ein Log.(TAG, "seite: " + seite); unter dein switchCase block in instantiateItem packst und dann mal etwas hin und her wischen während du logcat im Auge hast. :p
 
  • Danke
Reaktionen: Manuel1805
Vielen Dank für den Tipp.
Habe einen kleinen Fehler korrigiert...

Code:
public int getSeite() {
		if (seite < 2) {
			return 0;
		} else if (seite < 46 && seite > 0) {
			return this.seite-1;
		} else
			return 0;
	}

Ich bin jetzt um die Erkenntnis weiter, dass beim case 0 die Variable "seite" nicht mit dem Wert 1 gefüllt wird und beim Fortblättern der Variablenwert immer um 2 erhöht ist und beim Zurückblättern richtig ist. Weiß aber noch nicht den Grund.


Kann mir jemand sagen, was ich falsch mache??:confused2:
 

Anhänge

  • log.txt
    245 Bytes · Aufrufe: 67
Um dir deine Erkenntnisse wieder zunichte zu machen, nehme deinen ViewPager und packe ein
.setOffScreenLimit(10);
drauf. Beobachte was dann das Log.(...) sagt.

Aber um das jetzt nicht zu mühselig werden zu lassen:
Du hast die falsche Vorstellung davon, was ein Adapter ist bzw. was dieser machen soll.
Dem Adapter ist es reichlich egal, was du dir gerade anschaust. Er sorgt grundsätzlich dafür, dass Dinge wie Listen, Grids aber auch viewpager mit Daten versorgt werden.
Du schaust dir ja dann die bereitgestellten Daten über den ViewPager an. Dieser hat demzufolge Kenntnis darüber, was du dir gerade anschaust.
Daher macht es eventuell mehr Sinn, den ViewPager zu fragen, ob er dir nicht sein getCurrentItem(); geben kann.
 
  • Danke
Reaktionen: Manuel1805
Das war echt ein super Tipp. Da sieht man mal wieder dass man nichts weiß...:unsure: oder zumindest noch viel lernen muss...

Mein nun funktionierender Code sieht wie folgt aus:

Code:
private int sinnSeite;
  	
	public ViewPager viewPager;
	SinnPageAdapter adapter;
	
		
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.start_kapitel, container, false);

		// ViewPager initialisieren
		adapter = new SinnPageAdapter(this.getActivity());
		viewPager = (ViewPager) view.findViewById(R.id.viewPager);
		viewPager.setAdapter(adapter);
		// starte mit erstem Layout (sinnSeite)
		laden();
		viewPager.setCurrentItem(sinnSeite);
		adapter.setPunkte(this.sinnPunkte);
		return view;
    }
	
		
	public void onPause() {
		sinnPunkte = adapter.getPunkte();
		this.speichern();
		super.onPause();
    }

	public void speichern() {
		SharedPreferences prefs = getActivity().getPreferences(
				Context.MODE_PRIVATE);
		SharedPreferences.Editor meinEditor = prefs.edit();
		meinEditor.putInt("sinnSeite", viewPager.getCurrentItem());
		meinEditor.apply();
		}

	public void laden() {
		SharedPreferences prefs = getActivity().getPreferences(
				Context.MODE_PRIVATE);
			this.sinnSeite = prefs.getInt("sinnSeite", 0);
    	}
}


Der ursprüngliche Beitrag von 13:40 Uhr wurde um 13:43 Uhr ergänzt:

tuppy darf ich dir noch eine letzte Frage stellen?

Warum beendet die Zurücktaste meine App, trotz eingabauter onBackPressed-Methode?

Code:
public void onBackPressed() {
        if (viewPager.getCurrentItem() == 0) {
            viewPager.setCurrentItem(0);
            
        } else {
           viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
        }
    }
 
Code:
@Override
public void onBackPressed() {
    super.onBackPressed();
}
Zeigt er dir ein Fehler an, wenn du die Methode so schreibst?
Sie kommt in die Aktivität. Von dort aus muss sie den Event ans Fragment senden. Den super call musst du drin haben, sonst kommst mit back nicht mehr raus.

Nebenbei: Macht das Sinn?
Code:
if (irgendwas == 0) {
    irgendwas = 0;
}
 

Ähnliche Themen

D
  • djsnoopy
Antworten
6
Aufrufe
617
djsnoopy
D
M
Antworten
3
Aufrufe
169
moin
M
S
Antworten
8
Aufrufe
512
swa00
swa00
Zurück
Oben Unten