Entferne den Listener von ViewTreeObserver

8

Ich muss genau auf ein globales Layout-Ereignis achten, um anfänglich korrekte Scroll-Positionen einzustellen. Nachdem ich ein wenig gesucht habe, warum meine Aufrufe von scrollTo(x,y) ignoriert zu werden scheinen, habe ich festgestellt, dass diese nur dann sinnvoll aufgerufen werden können, wenn das gesamte Layout bekannt ist. Also registriere ich ein GlobalLayoutListener und verschiebe meinen Anruf auf scrollTo() .

Das Problem ist, dass ich das Scrollen nur einmal machen möchte. Also dachte ich, ich könnte einfach removeGlobalOnLayoutListener() anrufen, um nicht mehr zuzuhören. Dies führte zu einer Ausnahme: IllegalStateException: This ViewTreeObserver is not alive, call getViewTreeObserver() again . Also dachte ich mir geht es gut, wenn der Observer nicht lebt, wird er keine Ereignisse auslösen. Aber leider tut es: Meine Ansicht wird jedes Mal gescrollt, wenn sich das Layout irgendwie ändert.

Meine aktuelle Iteration des Codes sieht so aus. Was kann ich ändern, um sicherzustellen, dass der Aufruf von scrollToGridPos() nur einmal stattfindet? Ich weiß, ich könnte einfach ein lokales Feld mHasFired zur inneren Klasse hinzufügen, aber das scheint mir sehr dreckig zu sein hack ...

%Vor%     
Marcus Riemer 04.10.2014, 12:11
quelle

1 Antwort

24

Sie sollten mLayout.getViewTreeObserver() in onGlobalLayout() verwenden und nicht versuchen, auf alt zuzugreifen. ZB.

%Vor%     
Paul Burke 04.10.2014, 14:22
quelle

Tags und Links