Die richtige Lösung ist, die Sichtbarkeit dieser Ansicht wieder einzuschalten, bevor sie recycelt ist und es dann ausschalten zurück, bevor sie gezogen wird.
((BaseAdapter) getAdapter()).notifyDataSetChanged();
mDownY = mLastEventY;
final int switchViewStartTop = switchView.getTop();
mobileView.setVisibility(View.VISIBLE);
switchView.setVisibility(View.INVISIBLE);
updateNeighborViewsForID(mMobileItemId);
final ViewTreeObserver observer = getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
observer.removeOnPreDrawListener(this);
mit ersetzen,
mobileView.setVisibility(VISIBLE);
((BaseAdapter) getAdapter()).notifyDataSetChanged();
mDownY = mLastEventY;
final int switchViewStartTop = switchView.getTop();
updateNeighborViewsForID(mMobileItemId);
final ViewTreeObserver observer = getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
observer.removeOnPreDrawListener(this);
View mobileView = getViewForID(mMobileItemId);
if (mobileView != null) mobileView.setVisibility(INVISIBLE);
Die stableid Lösung ist falsch. Die IDs sind stabil und sagen, dass sie nicht fehlerhaft sind. Es klickt einfach das System an, um die Ansichten auf die alte Art zu recyceln. Was war in der Tat eine schlechte Art, es zu tun und wurde in Lollipop behoben. Dies ist eine viel genauere Lösung. Anstatt vorherzusagen, wie sich das .notifyDataSetChanged auf die Ansichten auswirkt und die richtigen Elemente bei der von Ihnen verwendeten Version ein- und ausschaltet. Dieser wird die Sichtbarkeit in allen Fällen einschalten. Dann im Predraw-Listener, um die Ansicht wieder zu finden und sie unsichtbar zu machen, bevor sie gezeichnet wird und nachdem sie in ihrem richtigen Zustand ist.
Und es spielt keine Rolle, ob diese Ansicht die gleiche ist oder nicht, oder eine zukünftige Version mit einer anderen Methode, oder ein schlechter Adapter, der die Ansichten nicht recycelt, usw. Stabile IDs oder nicht-stabile IDs (markiert nicht stabil, sie müssen immer noch stabil sein, aber das ist leicht zu reparieren), es ist der Weg, um es richtig und zukunftssicher zu machen.
Das Problem hier ist, dass die recycelte Ansicht, die Sie bekommen, nicht wirklich klar ist (sie sind halb Müll wieder aufbereitete Ansichten), nicht Dinge, in denen Sie Eigenschaften sicher speichern können. Das Verhalten wurde in Lollipop geändert Halten Sie stabile Ansichten tatsächlich stabil, wenn sie können, könnten Sie in der Adapterfunktion einchecken und die wiederverwertete Ansicht wird wahrscheinlich bereits Ihre Daten haben, weil es Ihnen die gleiche Ansicht wieder oft wiedergibt. Welches ist was du willst, weshalb Lollipop es so macht.
Das Problem hier ist, dass der Code besagt, dass mobileView sichtbar gemacht werden sollte (die, die Sie bewegen), und die SwitchView sollte unsichtbar gemacht werden (die, die Sie mit wechseln). Aber diese werden recycelt werden, so dass sie technisch mehrdeutig sind, was man zurückbekommt, und hängt vollständig davon ab, wie das System die Ansichten recycelt, und es ist völlig erlaubt, dieses Verhalten zum Besseren zu ändern, und tat es auch.
Ps. Ich sorge mich darum, nach Null zu suchen, weil ich persönlich die Ansichten in der Mitte vertausche und es kann manchmal am Ende Null sein, wenn man die Dinge richtig trifft.
int deltaYTotal = (mHoverCellOriginalBounds.bottom + mHoverCellOriginalBounds.top)/2
+ mTotalOffset + deltaY;
...
boolean isBelow = (belowView != null) && (deltaYTotal > belowView.getTop());
boolean isAbove = (aboveView != null) && (deltaYTotal < aboveView.getBottom());
Danke für Ihre Korrektur, es funktioniert meistens, aber es gibt immer noch einen Fehler. Wenn Sie ein Element über den unteren Rand der Liste ziehen, scrollt die Liste automatisch nach unten. Wenn Sie jetzt den gleichen Eintrag nach oben ziehen, ohne ihn freizugeben, scrollt die Liste nach oben, aber es erscheint ein leerer Eintrag. – Venator85
Für mich, mit Lollipop funktioniert es gut in beide Richtungen, wenn ich den 'else' Teil komplett entferne. Mit anderen Worten, für Lollipop ändert sich die Sichtbarkeit von mobileView oder switchView nicht. – Ridcully
guten job, thx !!! – exequielc