Element entfernen + Blättern zur Nächsten im Android ViewPager
Ich habe eine Aktivität mit einem ViewPager, dass zeigt die N-Fragmente. Jedes fragment ist, in dem die Eigenschaften eines Objekts aus einer ArrayList in mein ViewPager die benutzerdefinierten adapter (erweitert FragmentStatePagerAdapter
).
Fragment hat (unter anderem) einen button, der sollte entfernen Sie die aktuell angezeigte fragment und Blättern Sie zu der nächsten mit setCurrentItem(position, true)
so, dass, wenn der Benutzer blättert zurück, das Vorherige Element ist verschwunden. Ich dies tun, indem Sie etwas wie folgt aus (vereinfacht):
deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyActivity parentActivity = (MyActivity)getActivity();
//First, scroll to next item (smoothly)
parentActivity.pager.setCurrentItem(parentActivity.pager.getCurrentItem()+1, true);
//Database stuff...
doSomeDBOperations();
//Method in Activity that removes the current object (I believe this method is working fine and yes, it calls notifyDataSetChanged())
parent.removeObject(currentObject);
}
});
Dies ist das gewünschte Verhalten, wie das Objekt, vertreten durch das fragment, dessen löschen-Schaltfläche gedrückt wurde, wird entfernt, und der viewpager geht auf der nächsten Seite.
Mein problem ist, dass der ViewPager nicht scrollen flüssig, sondern "springt sofort auf das nächste fragment. Wenn ich den Kommentar der removeObject()
nennen, die smooth scroll funktioniert (aber das Element nicht entfernt). Ich glaube, es hat etwas zu tun mit der removeObject()
wird aufgerufen, bevor die setCurrentItem() beendet wurde, die smooth-scrolling-animation?
Irgendwelche Ideen auf, wie man dieses Problem beheben und erreichen Element entfernen + glatte scrollen? Wenn meine Annahme richtig ist, wie kann ich sicherstellen, dass ich den glatten Blättern Sie zu beenden, bevor Sie Sie entfernen das Objekt?
EDIT 1:
Meine Vermutung scheint richtig. Wenn ich die parent.removeObject(currentObject)
innen
//...inside the previously shown public void onClick(View v)...
confirm.postDelayed(new Runnable() {
@Override
public void run() {
//Method in Activity that removes the current object (I believe this method is working fine and yes, it calls notifyDataSetChanged())
parent.removeObject(currentObject);
}
}, 1000);
so, dass die removeObject()
Anruf wartet für eine Sekunde, es funktioniert wie erwartet: führen Sie einen Bildlauf zum nächsten Element, entfernen Sie die alte. Aber das ist eine sehr hässliche workaround also ich würde noch gerne einen besseren Ansatz.
EDIT 2:
Ich dachte, eine mögliche Lösung (siehe unten).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Landete ich überschreiben der
Methode:
Immer, wenn der Benutzer drückt die Schaltfläche löschen in der fragment, der Hörer legt ein boolescher Wert im aktuellen Element (flagging es für die Löschung) und scrollt zum nächsten.
Wenn die
onPageScrollStateChanged
erkennt, dass die scroll-Zustand geändert, umViewPager.SCROLL_STATE_IDLE
(was passiert, wenn die glatten Blättern enden) es wird überprüft ob das Vorherige Element war zum löschen markiert, und, wenn ja, entfernen Sie es aus der ArrayList, und fordertnotifyDataSetChanged()
.So, ich habe es geschafft, den ViewPager, um reibungslos Blättern Sie zu der nächsten position und löschen Sie den vorherigen Punkt, wenn der "löschen" - Taste gedrückt wird.
EDIT: Code-snippet.
Haben Sie versucht, ViewPager.OnPageChangeListener?
Ich würde anrufen removeObject(n) Methode in OnPageChangeListener.onPageSelected(n+1) - Methode.
Habe ich etwas anderes, das funktioniert reibungslos. Die Idee ist, entfernen Sie den aktuellen Eintrag mit animation (Einstellung seinen alpha-Wert auf 0), dann übersetzen horizontal Links oder rechts Artikel (mit animation) zu der jetzt unsichtbaren position.
Nachdem die animation fertig ist, habe ich die Daten entfernen und
notfyDataSetChanged()
nennen.Diese
remove()
Methode, die ich in eine Unterklasse vonViewPager