都知道ListView的特性是布局复用,但是当ScrollView嵌入了Listview时,这时Listview是不存在布局复用的,因为在根据内容测量实际高度,然后在代码中设置 ListView 的高度,整体高度都已经重新计算,自然就不存在布局复用一说
ListView本身可以通过setOnScrollListener函数设置滑动监听当前页面可视的子项以及数量,当ScrollView嵌入了Listview时,每一条子项都是可视的VisibleItem,visibleItemCount就是所有的item总数,这样的话想知道屏幕具体是哪个子项在可见就没法通过onScroll函数的参数处理了
而我的解决办法就是在onScroll函数中监听滑动的距离来计算当前item的可视化的逻辑处理,列如根据滑动距离计算视频暂停处理
scrollView.setOnScrollListener(new MyScrollView.OnScrollListener(){
@Override
public void onScrolled() {
try {
if(listView != null && currentPlayPos >= 0 && currentPlayheight > 0){
int screenW = scrollView.getHeight();//当前屏幕宽度
int y = scrollView.getScrollY();
int top = midMenuLay.getTop() + midMenuLay.getHeight();
// int top = ScreenTool.convertDpToPx(activity, 241);
DebugUtils.debug(TAG, "onScrolled y " + y + " top " + top + " screenW " + screenW);
int currentPlayItemTop = listView.getChildAt(currentPlayPos).getTop();
DebugUtils.debug(TAG, "onScrolled currentPlayItemTop " +currentPlayItemTop + " currentPlayheight " + currentPlayheight);
if((y - top) >= (currentPlayItemTop + currentPlayheight)){ //向下滑动
DebugUtils.debug(TAG, "当前视频不可见,下翻");
if(adapter != null){
adapter.stopPlay();
currentPlayPos = -1;
}
}else if(y - top + screenW <= currentPlayItemTop){ //向上滑动
DebugUtils.debug(TAG, "当前视频不可见,上翻");
if(adapter != null){
adapter.stopPlay();
currentPlayPos = -1;
}
}
}
} catch (Exception e){
e.printStackTrace();
}
}
});
解释以下上述代码:
top = midMenuLay.getTop() + midMenuLay.getHeight(); 是紧挨着Listview上面一个布局的高度以及宽度,计算这个布局的高度宽度,用滑动的距离减去该距离就可以得到listview的第一个item的高度,这个高度可以直接通过
listView.getChildAt(0).getTop()获取,上述的目的只是为了判断当前选中的item在滑动过程中是否存在于该屏幕,便于一些逻辑处理如视频的播放或者暂停等