Ich möchte die Streaming-Videoliste-App implementieren. Ich habe RecyclerView
verwendet, um mein Listenelement anzuzeigen. Der Artikeltyp enthält 4 Typen: Artikel, Status, Foto und Video. Wir sollten uns nur auf den Videotyp konzentrieren. Hier ist mein Code für den RecyclerView-Adapter:
Wenn der Elementtyp Video ist, erstelle ich eine ExoPlayer
-Instanz, um dieses Video abzuspielen, und füge diese Instanz zu einem HashMap
zur späteren Verwendung hinzu (mit Schlüsselwert ist die Position des Elements). Wenn ein Videoartikel recycelt wird, lasse ich den Player los und entferne ihn aus HashMap
.
Alles sieht gut aus, aber ein Problem. Ich nehme an, der Videogegenstand ist auf Position 0 (jetzt können wir die Videovorschau in diesem Artikel sehen). Ich scrolle das RecyclerView
gerade so weit runter, dass das Element 0 nicht angezeigt wird. In diesem Moment ist der VideoViewHolder von Element 0 noch nicht recycled. Dann scrolle ich nach oben, um Punkt 0 anzuzeigen. Die Ansicht ist jetzt leer, die Videovorschau wird nicht angezeigt. Ich klicke auf Punkt 0, um das Video abzuspielen, der Player spielt nur Audio (Ton) ab, kein Video. Nach ein paar Sekunden ist das Video nun sichtbar.
Ich debuggte und fand heraus, dass nach dem Scrollen nach unten, um das Videoobjekt auszublenden, SurfaceView
zerstört wurde. Wenn Sie nach oben scrollen, um ein Videoelement anzuzeigen, wird SurfaceView
erstellt. Ich denke, das ist der Grund, warum VideoViewHolder
anstelle der Videovorschau eine leere Ansicht zeigt.
Hier ist meine Frage: Wie kann ich die Videovorschau anzeigen, nachdem ich zum Videoelement zurückgeblättert bin?
Hier ist ein Hinweis von der ExoPlayer Dokumentation
Das SurfaceView-Rendering wurde nicht ordnungsgemäß mit Ansichtsanimationen bis Android N synchronisiert. Bei früheren Releases konnte dies zu unerwünschten Effekten führen, wenn ein SurfaceView in einen Scroll-Container platziert wurde oder wenn es einer Animation unterzogen wurde. Solche Effekte beinhalteten, dass der Inhalt des SurfaceView etwas hinter der Stelle, an der er angezeigt werden sollte, zurückblieb und dass die Ansicht bei Animation schwarz wurde.
Um eine reibungslose Animation oder das Scrollen von Videos vor Android N zu erreichen, ist es notwendig, dass Sie TextureView und nicht SurfaceView verwenden. Wenn keine sanfte Animation oder Scrolling erforderlich ist, sollte SurfaceView bevorzugt werden
Um TextureView
surface_type zu aktivieren, müssen Sie es in Ihrer XML-Datei wie unten gezeigt setzen
Tags und Links android video android-recyclerview exoplayer