# Gsy List Playback

RecyclerView / ViewPager2 / ViewPager 列表滑动自动播放，滚动切换、复用绑定、进入详情页时"漂移"到全屏。

- Repository: https://github.com/CarGuo/GSYVideoPlayer (21524 stars)
- Category: Engineering
- License: Apache-2.0
- Last updated: 2026-10-10
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-list-playback -g -a claude-code -y`
Codex: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-list-playback -g -a codex -y`
Cursor: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-list-playback -g -a cursor -y`
Gemini CLI: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-list-playback -g -a gemini-cli -y`

## Description

RecyclerView / ViewPager2 / ViewPager 列表滑动自动播放，滚动切换、复用绑定、进入详情页时"漂移"到全屏。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# gsy-list-playback

## 三条实现路线

| 路线 | 特点 | 适用 |
|---|---|---|
| **A. 每 item 内嵌 `StandardGSYVideoPlayer`** | 每条 item 有独立 player 实例，滑到即播 | 大多数场景（含无限缩略页面） |
| **B. `ListVideoUtil` 单例复用** | 全列表共享一个 player 实例，动态 `attachToParent` | 内存敏感、条目多；不能同屏两个视频 |
| **C. `GSYVideoHelper` 悬浮小窗** | 用于详情页返回列表时"漂浮"续播 | 抖音式详情返回 |

## 路线 A：每 item 一个 player

关键点：**在 `onBindViewHolder` 里给每个 player `setPlayPosition(position)` + `setPlayTag(String)`**，防止滚动复用导致 URL 命中错人。

`GSYVideoOptionBuilder`：
- `setPlayTag(String)` [#L347](../../gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/builder/GSYVideoOptionBuilder.java)
- `setPlayPosition(int)` [#L356](../../gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/builder/GSYVideoOptionBuilder.java)

滚动出屏自动释放：`RecyclerView.OnScrollListener` → 当前 firstVisible / lastVisible 之外的 holder 调 `GSYVideoManager.releaseAllVideos()`。

见 [RecyclerViewActivity](../../app/src/main/java/com/example/gsyvideoplayer/RecyclerViewActivity.java)。

## 路线 B：`ListVideoUtil`（跨 item 复用一个 player）

工具类：[ListVideoUtil](../../gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/utils/ListVideoUtil.java)。

| API | 说明 |
|---|---|
| `ListVideoUtil(Context)` | 单例创建（在 Activity/Fragment 里持一份） |
| `addVideoPlayer(int position, ImageView thumb, String tag, ViewGroup container, View playBtn)` | 把 player 移到 `container`；`tag` 与 `position` 用于识别是否是新目标 |
| `setPlayPositionAndTag(int, String)` | 手动更新目标 |
| `startPlay(String url)` | 开始播放 |
| `isCurrentViewPlaying(int pos, String tag)` | 判定当前播放是否在这个 item |
| `releaseVideoPlayer()` | 释放，通常在离开页面时调 |

**自动可视区触发**用 [ScrollCalculatorHelper](../../app/src/main/java/com/example/gsyvideoplayer/utils/ScrollCalculatorHelper.java) 的 `onScrollReleaseAllVideos(...) / onScrollPlayVideo(...)`。见 [AutoPlayRecyclerViewActivity](../../app/src/main/java/com/example/gsyvideoplayer/AutoPlayRecyclerViewActivity.java)。

## 路线 C：`GSYVideoHelper` 小窗漂移

The rest: https://github.com/CarGuo/GSYVideoPlayer/blob/HEAD/skills/05-gsy-list-playback/SKILL.md
