0

Ich habe Probleme beim Implementieren von setCurrentItem auf meinem Viewpager.Android ViewPager setCurrentItem funktioniert nicht

Ich versuche, die Ganzzahl in shared Pref zu speichern, also wenn der Benutzer zu der Aktivität zurückkehrt, ist es auf derselben Seite, auf der sie aufgehört haben.

Hier ist meine Tätigkeit mit dem viewpager:

public class MyWorkout extends BaseActivity { 

NonSwipeableViewPager vp; 
TextView txtViewTitle; 
String workoutTitle; 
SharedPreferences pref; 
private final String LOG = MyWorkout.class.getSimpleName(); 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
    SharedPreferences.Editor editor = pref.edit(); 
    int currentPage = pref.getInt("currentPage", 0); 


    setContentView(R.layout.my_workout); 

    mToolBar = activateToolbar(); 
    setUpNavigationDrawer(); 
    getSupportActionBar().setTitle("My Workout"); 


    workoutTitle = pref.getString("current_workout", "default"); 
    Button btnPrev = (Button) findViewById(R.id.btnPrevious); 
    Button btnNext = (Button) findViewById(R.id.btnNext); 
    vp = (NonSwipeableViewPager) findViewById(R.id.view_pager); 
    txtViewTitle = (TextView) findViewById(R.id.txtViewTitle); 
    this.addPages(vp); 

    vp.setCurrentItem(currentPage); 
    Log.d(LOG, "current value is " + currentPage); 

    btnNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MoveNext(); 
     } 
    }); 

    btnPrev.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MovePrevious(); 
     } 
    }); 


    public void MoveNext() { 
    vp.setCurrentItem(vp.getCurrentItem() + 1); 
    int current = vp.getCurrentItem(); 
    pref.edit().putInt("currentPage", current).apply(); 
    Log.d(LOG, "current value is " + current); 
} 

public void MovePrevious() { 
    vp.setCurrentItem(vp.getCurrentItem() - 1); 
    int current = vp.getCurrentItem(); 
    pref.edit().putInt("currentPage", current).apply(); 
    Log.d(LOG, "current value is " + current); 
} 

Ich weiß, es richtig ist das Hinzufügen/auf den gemeinsam genutzten pref auf dem Protokoll basiert subtrahiert wird. Wenn ich auf "Weiter" klicke, wird eins hinzugefügt, bei "Vorheriges" wird eins subtrahiert. Das Problem muss mit der Zeile sein:

Wenn ich auf die Seite zurück gehe, geht es immer auf die erste Seite zurück.

Hier ist mein NonSwipeableViewPager:

public class NonSwipeableViewPager extends ViewPager { 

public NonSwipeableViewPager(Context context) { 
    super(context); 
    setMyScroller(); 
} 

public NonSwipeableViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setMyScroller(); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    // Never allow swiping to switch between pages 
    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // Never allow swiping to switch between pages 
    return false; 
} 

//down one is added for smooth scrolling 

private void setMyScroller() { 
    try { 
     Class<?> viewpager = ViewPager.class; 
     Field scroller = viewpager.getDeclaredField("mScroller"); 
     scroller.setAccessible(true); 
     scroller.set(this, new MyScroller(getContext())); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public int getCurrentItem() { 
    return super.getCurrentItem(); 
} 

@Override 
public void setCurrentItem(int item) { 
    super.setCurrentItem(item); 
} 

public class MyScroller extends Scroller { 
    public MyScroller(Context context) { 
     super(context, new DecelerateInterpolator()); 
    } 

    @Override 
    public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
     super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/); 
    } 
} 
} 

Und hier ist MyFragPagerAdapter:

public class MyFragPagerAdapter extends FragmentPagerAdapter { 

ArrayList<Fragment> pages = new ArrayList<>(); 


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

@Override 
public Fragment getItem(int position) { 
    return pages.get(position); 
} 

@Override 
public int getCount() { 
    return pages.size(); 
} 

//ADD A PAGE 

public void addPage(Fragment f) { 
    pages.add(f); 
} 
} 

Ich bin sicher, es ist etwas einfach fehle ich, aber vielleicht ein frisches Paar Augen helfen! Danke vielmals!

Antwort

0

Die Methoden moveNext() und moveBack() funktionieren, weil Sie den Index eher aus dem Ansichtspager als aus den gemeinsamen Voreinstellungen ziehen. Ich würde den Wert in den gemeinsamen Einstellungen ausdrucken, indem ich ihn abrufe, jedes Mal, wenn Sie ihn speichern und sicherstellen, dass er richtig ist. Es sieht so aus, als wäre es auf 0 gesetzt - der erste Index - also wird es vielleicht nicht korrekt gespeichert. Versuchen Sie, apply() in einer separaten Zeile aufzurufen.

+0

Danke für die Antwort. Ich denke, die shared prefs funktioniert gut, weil sogar das Protokoll direkt nach setCurrentItem mir den richtigen Wert gibt. Ich habe auch versucht, aktuelle Seite auf nur 5 zu setzen, um zu sehen, ob es funktionieren würde, leider hat es auch nicht funktioniert – LBJ33

0

Sie speichern den Index der aktuellen Seite nach dem Einstellen des aktuellen Elements.

so ist es nicht notwendig, den Index zu berechnen.

Sie sollten direkt den Wert von vp.getCurrentItem().

+0

Sie haben Recht, ich hatte eine Menge redundanten Code! Ich habe den Code in meinem ersten Post geändert, leider funktioniert es immer noch nicht. Ich glaube, es spart ordentlich in shared pref, aber es setzt nicht die richtige Seite. Selbst wenn ich es in vp.setCurrentPage (5) ändere, bleibt es immer auf Seite 1. – LBJ33

+0

können Sie es mit dem normalen ** ViewPager **, nicht ** NonSwipeableViewPager ** versuchen? dann funktioniert es oder nicht? dann können wir sicher sein, dass NonSwipeableViewPager genau in Ordnung ist oder nicht. –

0

Mein Fall ist ein bisschen anders speichern, aber ich werde meine Lösung umfassen, jedem zu helfen, die das gleiche Problem haben werden.

setCurrentItem() funktionierte nicht für mich, weil ich vergessen hatte zu aktualisieren getCount().

Meine getCount() Methode in meiner Implementierung der FragmentPagerAdapter wurde die falsche Anzahl angezeigt, so konnte es Seite nicht ändern, da es nicht Teil seiner Anzahl war.

Verwandte Themen