android ScrollView嵌入Listview布局不复用时,判断选中的item在滑动过程中是否还在屏幕上显示,用于功能逻辑处理

1 篇文章 0 订阅
1 篇文章 0 订阅

都知道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在滑动过程中是否存在于该屏幕,便于一些逻辑处理如视频的播放或者暂停等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值