在做將視頻播放器放到ListView進行播放時往往會遇到如下問題:
如何判斷l(xiāng)istview的item已經(jīng)滑出屏幕,以便將正在播放的視頻停止明肮?
通過listView.setOnScrollListener(new AbsListView.OnScrollListener())監(jiān)聽ListView的滑動事件即可實現(xiàn)此功能。
完整代碼如下:
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;// 記錄滑動狀態(tài)
@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) { // 避免不必要的執(zhí)行
//如果上一個 屏幕中第一個可見的item的position已經(jīng)小于當前屏幕中第一個可見item的position蔬捷,表示item已經(jīng)完全滑出屏幕了
//這種情況一般出現(xiàn)在ListView上滑的時候幔翰,故此時我們可以把firstView上的播放器停止
if (lastFirstVisibleItem < firstVisibleItem) {
gcView(firstView);
//通過firstVisibleItem + visibleItemCount - 1我們可以得到當前屏幕上最后一個item的position
//如果屏幕中最后一個可見的item的position已經(jīng)大于當前屏幕上最后一個item的position凭疮,表示item已經(jīng)完全滑出屏幕了
//這種情況一般出現(xiàn)在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
}
}
});