RecyclerView監聽滑動,自動播放視訊列表,有點意思
GitHub/">GitHub
RecyclerViewVideoPlayList" target="_blank" rel="nofollow,noindex">https://github.com/AnJiaoDe/RecyclerViewVideoPlayList視訊列表頁自動播放
1自動播放功能-使用者上滑流程圖

在這裡插入圖片描述
2.自動播放功能-使用者下滑流程圖

在這裡插入圖片描述

在這裡插入圖片描述
解決思路:
上滑:播放視訊的item view的頂部Y座標(相對於整個螢幕)和recyclerview頂部Y座標(相對於整個螢幕)進行對比,判斷是否需要停止播放,自動播放其他視訊等;
下滑:同理

在這裡插入圖片描述

在這裡插入圖片描述
實現起來有點複雜,話不多說,上程式碼:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <com.cy.cyrvadapter.recyclerview.VerticalRecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/vrv" /> </RelativeLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv" android:layout_width="match_parent" android:background="#eee" android:gravity="center" android:textSize="18sp" android:textColor="#454545" android:layout_marginBottom="10dp" android:layout_height="200dp"> </TextView>
MainActivity.java
public class MainActivity extends AppCompatActivity { private RVAdapter<PlayBean> rvAdapter; private int position_play = -1;//播放的位置 //使用者手動點選播放後,自動播放開始, // 除非使用者手動點選停止,或者視訊播放完畢,停止自動播放, private boolean isLooper = false; private int looperFlag = 0;//0,無自動播放,1.自動播放上一個,2自動播放下一個 private List<PlayBean> list; private VerticalRecyclerView verticalRecyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); list = new ArrayList<>(); //播放狀態0播放,1停止 list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); list.add(new PlayBean(1)); /** * 萬能介面卡,參考https://github.com/AnJiaoDe/RecyclerViewAdapter */ rvAdapter = new RVAdapter<PlayBean>(list) { @Override public void bindDataToView(RVViewHolder holder, int position, PlayBean bean, boolean isSelected) { int state = bean.getState(); String tv_text = ""; //播放狀態0播放,1停止 switch (state) { case 0: tv_text = position + "正在播放"; holder.setTextColor(R.id.tv, 0xffff0000); break; case 1: tv_text = position + "停止"; holder.setTextColor(R.id.tv, 0xff454545); break; } holder.setText(R.id.tv, tv_text); } @Override public int getItemLayoutID(int position, PlayBean bean) { return R.layout.item; } @Override public void onItemClick(int position, PlayBean bean) { //播放狀態0播放,1停止 int state = bean.getState(); switch (state) { case 0: bean.setState(1); isLooper = false;//自動播放停止 break; case 1: if (position_play != -1) list.get(position_play).setState(1);//上次播放的要停止 position_play = position; bean.setState(0); isLooper = true;//自動播放開始 break; } notifyDataSetChanged(); } }; verticalRecyclerView = ((VerticalRecyclerView) findViewById(R.id.vrv)); verticalRecyclerView.setAdapter(rvAdapter); verticalRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //滑動停止後, if (newState == RecyclerView.SCROLL_STATE_IDLE && isLooper && looperFlag != 0) { LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); switch (looperFlag) { case 1: int position_lastVisible=layoutManager.findLastVisibleItemPosition(); if (position_lastVisible==position_play){ //自動播放上一個 position_play-=1; }else { //最後一個可見的item和滑出去的上次播放的view隔了N(N>=1)個Item,所以自動播放倒數第2個可見的item position_play=position_lastVisible-1; } break; case 2: int position_firstVisible=layoutManager.findFirstVisibleItemPosition(); if (position_firstVisible==position_play){ //自動播放下一個 position_play+=1; }else { //第一個可見的item和滑出去的上次播放的view隔了N(N>=1)個Item,所以自動播放第2個可見的item position_play=position_firstVisible+1; } break; } list.get(position_play).setState(0); rvAdapter.notifyItemChanged(position_play); //注意 looperFlag=0; } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (!isLooper) return; LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); View view = layoutManager.findViewByPosition(position_play); //說明播放的view還未完全消失 if (view != null) { int y_t_rv = ScreenUtils.getViewScreenLocation(verticalRecyclerView)[1];//RV頂部Y座標 int y_b_rv = y_t_rv + verticalRecyclerView.getHeight();//RV底部Y座標 int y_t_view = ScreenUtils.getViewScreenLocation(view)[1];//播放的View頂部Y座標 int height_view = view.getHeight(); int y_b_view = y_t_view + height_view;//播放的View底部Y座標 //上滑 if (dy > 0) { //播放的View上滑,消失了一半了,停止播放, if ((y_t_rv > y_t_view) && ((y_t_rv - y_t_view) > height_view * 1f / 2)) { list.get(position_play).setState(1); rvAdapter.notifyItemChanged(position_play); looperFlag = 2;//自動播放下一個 } } else if (dy < 0) { //下滑 //LogUtils.log("y_t_rv", y_t_rv); //LogUtils.log("y_b_rv", y_b_rv); //播放的View下滑,消失了一半了,停止播放 if ((y_b_view > y_b_rv) && ((y_b_view - y_b_rv) > height_view * 1f / 2)) { list.get(position_play).setState(1); rvAdapter.notifyItemChanged(position_play); looperFlag = 1;//自動播放上一個 } } } } }); } }
各位老鐵有問題歡迎及時聯絡、指正、批評、撕逼
GitHub https://github.com/AnJiaoDe
關注專題Android開發常用開源庫 https://www.jianshu.com/c/3ff4b3951dc5
簡書 https://www.jianshu.com/u/b8159d455c69
微信公眾號

這裡寫圖片描述
QQ群

這裡寫圖片描述