遇到的问题描述:
嵌套后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}