在做将视频播放器放到ListView进行播放时往往会遇到如下问题:
如何判断listview的item已经滑出屏幕,以便将正在播放的视频停止?
通过listView.setOnScrollListener(new AbsListView.OnScrollListener())监听ListView的滑动事件即可实现此功能。
完整代码如下:
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
private View firstView; //记录当前屏幕中第一个可见的item对象
private View lastView; //记录当前屏幕中最后个可见的item对象
private int lastFirstVisibleItem; //记录当前屏幕中第一个可见的item的position
private int lastVisibleItem; // 记录屏幕中最后一个可见的item的position
private boolean scrollFlag;// 记录滑动状态
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
scrollFlag = false;
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
scrollFlag = true;
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
scrollFlag = true;
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (scrollFlag) { // 避免不必要的执行
//如果上一个 屏幕中第一个可见的item的position已经小于当前屏幕中第一个可见item的position,表示item已经完全滑出屏幕了
//这种情况一般出现在ListView上滑的时候,故此时我们可以把firstView上的播放器停止
if (lastFirstVisibleItem < firstVisibleItem) {
gcView(firstView);
//通过firstVisibleItem + visibleItemCount - 1我们可以得到当前屏幕上最后一个item的position
//如果屏幕中最后一个可见的item的position已经大于当前屏幕上最后一个item的position,表示item已经完全滑出屏幕了
//这种情况一般出现在ListView下滑的时候,故此时我们可以把lastView上的播放器停止
} else if (lastVisibleItem > firstVisibleItem + visibleItemCount - 1) {
gcView(lastView);
}
lastFirstVisibleItem = firstVisibleItem;
lastVisibleItem = firstVisibleItem + visibleItemCount - 1;
firstView = view.getChildAt(0);
lastView = view.getChildAt(visibleItemCount - 1);
}
}
private void gcView(View gcView) {
if (gcView != null) {
//stop player
}
}
});