NestedScrollView 嵌套ViewPageer,ViewPager中嵌套多个带RecyclerView的自定义view滑动时的问题解决

遇到的问题描述:

嵌套后ViewPager中的view展示不出来,解决办法:重新设置Viewpager的高度

自定义viewpager

1public class WrapViewPager extends ViewPager { 2 3 private int current; 4 private int height = 0; 5 /** 6 * 保存position与对于的View 7 */ 8 private HashMap<Integer, View> childrenViews = new LinkedHashMap(); 9 10 private boolean isCanScroll = false; 11 12 public WrapViewPager(Context context) { 13 super(context, null); 14 } 15 16 public WrapViewPager(Context context, AttributeSet attrs) { 17 super(context, attrs); 18 } 19 20 public void setScanScroll(boolean isCanScroll) { 21 this.isCanScroll = isCanScroll; 22 }//切换tab的时候重新设置viewpager的高度 23 public void resetHeight(int current) { 24 this.current = current; 25 if (childrenViews.size() > current) { 26 LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams(); 27 if (layoutParams == null) { 28 layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height); 29 } else { 30 layoutParams.height = height; 31 } 32 setLayoutParams(layoutParams); 33 } 34 } 35 36 /** 37 * 保存position与对于的View 38 */ 39 public void setObjectForPosition(View view, int position) { 40 childrenViews.put(position, view); 41 } 42 43 @Override 44 public void scrollTo(int x, int y) { 45 super.scrollTo(x, y); 46 } 47 48 @Override 49 public boolean onTouchEvent(MotionEvent arg0) { 50 try { 51 if (isCanScroll) { 52 return super.onTouchEvent(arg0); 53 } 54 } catch (Exception e) { 55 } 56 57 return false; 58 59 } 60 61 @Override 62 public boolean onInterceptTouchEvent(MotionEvent arg0) { 63 try { 64 if (isCanScroll) { 65 return super.onInterceptTouchEvent(arg0); 66 } 67 } catch (Exception e) { 68 69 } 70 71 return false; 72 } 73 74 @Override 75 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 76 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 77 if (childrenViews.size() > current) { 78 View child = childrenViews.get(current); 79 child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 80 height = child.getMeasuredHeight(); 81 } 82 heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 83 84 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 85 } 86}

  调用的方法:创建三个自定义view,添加到view列表中

1view1 = UserView(context) 2 viewpager.setObjectForPosition(goodView,0) 3 view2 = UserView(context) 4 viewpager.setObjectForPosition(middleView,1) 5 view3 = UserView(context) 6 viewpager.setObjectForPosition(badView,2) 7 8pageList.add(view1) pageList.add(view2) pageList.add(view3)

监听viewpager

1 viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { 2 override fun onPageScrollStateChanged(p0: Int) { 3 } 4 5 override fun onPageScrolled(p0: Int, p1: Float, p2: Int) { 6 } 7 8 override fun onPageSelected(index: Int) { 9 viewpager.resetHeight(index) 10 //自己的代码实现 11 } 12 })

设置好后高度问题解决了,因自定义view为了防止tab切换时每次重新加载页面和数据,做了return处理,这里viewpager高度变化后,

NestedScrollView 的高度也许变化,监听是否到底部的事件得重新监听,放到return之前即可

1scrollView.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> 2 if (scrollY == v.getChildAt(0).measuredHeight - v.measuredHeight) { 3 //到底了 4 if (isLoadMore) { 5 6 } else { 7 8 } 9 } 10 }) 11 12if (isLoading) { return}
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

uniapp中使用picker中的注意事项

APP端中picker点击后不弹出:1、请确保picker标签里面嵌套了一个view,并且view里面有值2、请确保picker中的默认值的格式跟该picker类型的值对应例如下面:<viewclass"time_wrap"<inputtype"tex

Android事件分发-基础原理和场景分析

和其他平台类似,Android中View的布局是一个树形结构,各个ViewGroup和View是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个View的范围内,这样就不知道哪个View来响应这个事件,为了解决这一问题,就出现了事件分发机制。

Android无限广告轮播 - 自定义BannerView

1.概述这其实是我第一篇想写的博客,可能是因为我遇到了太多的坑,那个时候刚入行下了很多Demo发现怎么也改不动,可能是能力有限,这次就做一个具体的实现和彻底的封装。  上次讲了,有了源码分析我们对ViewPager就有了一个大概的了解,那么再来封装成自定义View,就会简单许多,附视频讲解地址:    这里写图片描述2.效果封装2.1

Less 嵌套

本节我们学习Less中的嵌套,嵌套应该很容易理解,HTML语言中就支持标签的嵌套。我们在使用CSS时,如果想要为多层嵌套的元素设置样式,要么给元素加上一个类选择器或ID选择器,要么使用后代选择器。例如:.xkd{fontsize:14px;}.xkdp{lineheight:25

Android客户端图片左右滑动(自动切换)

本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和门户网站都有类似的实现:具体思路:1\.工程中需要添加androidsupportv4.jar,才能使用ViewPager控件.2\.图片的自动切换:可使用Timer或者ScheduledExecutorService,这个有多重方式可以实现.