项目场景:
短视频列表滑动播放,当列表停止滑动后播放当前短视频
问题描述
当列表停止滑动后播放当前短视频,需要计算出要播放的索引
原因分析:
因为一屏一条完全可见的数据,要想实现功能,需要计算出屏幕中短视频显示高度最大的那条数据的做引
解决方案:
1.当列表停止滑动的时候计算出要播放短视频的索引
2.根据索引更改短视频的播放状态
这里要注意一下,因为一屏完全显示一条数据,所以通过此方法计算,如果一屏可以展示多条数据,随机播放其中一条,此方法可能不适用
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE: //滚动停止
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (layoutManager != null) {
int currentViewIndex = getCurrentViewIndex(layoutManager);
if (mLastPosition != currentViewIndex) {
updateVideoPlayStatus(currentViewIndex);
}
}
break;
}
}
});
/**
*
* @param layoutManager
* @return 计算出要播放的短视频索引
*/
private int getCurrentViewIndex(LinearLayoutManager layoutManager) {
int firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
int lastVisibleItem = layoutManager.findLastVisibleItemPosition();
int currentIndex = firstVisibleItem;
int lastHeight = 0;
for (int i = firstVisibleItem; i <= lastVisibleItem; i++) {
View view = layoutManager.getChildAt(i - firstVisibleItem);
if (null == view) {
continue;
}
int[] location = new int[2];
view.getLocationOnScreen(location);
Rect localRect = new Rect();
view.getLocalVisibleRect(localRect);
int showHeight = localRect.bottom - localRect.top;
if (showHeight > lastHeight) {
currentIndex = i;
lastHeight = showHeight;
}
}
if (currentIndex < 0) {
currentIndex = 0;
}
return currentIndex;
}
/**
* 更新播放状态
* @param position 当前要播放的短视频索引
*/
private void updateVideoPlayStatus(int position) {
mLastPosition = position;
ArrayList<FindBean.ListBean> list = getList();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
FindBean.ListBean listBean = list.get(i);
if (i == position) {
listBean.playVideo = true;
} else {
listBean.playVideo = false;
}
}
}
getAdapter().notifyDataSetChanged();
}