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

Stella981
• 阅读 545

遇到的问题描述:

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

自定义viewpager

public class WrapViewPager extends ViewPager {

    private int current;
    private int height = 0;
    /**
     * 保存position与对于的View
     */
    private HashMap<Integer, View> childrenViews = new LinkedHashMap();

    private boolean isCanScroll = false;

    public WrapViewPager(Context context) {
        super(context, null);
    }

    public WrapViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setScanScroll(boolean isCanScroll) {
        this.isCanScroll = isCanScroll;
    }//切换tab的时候重新设置viewpager的高度
    public void resetHeight(int current) {
        this.current = current;
        if (childrenViews.size() > current) {
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
            if (layoutParams == null) {
                layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
            } else {
                layoutParams.height = height;
            }
            setLayoutParams(layoutParams);
        }
    }

    /**
     * 保存position与对于的View
     */
    public void setObjectForPosition(View view, int position) {
        childrenViews.put(position, view);
    }

    @Override
    public void scrollTo(int x, int y) {
        super.scrollTo(x, y);
    }

    @Override
    public boolean onTouchEvent(MotionEvent arg0) {
        try {
            if (isCanScroll) {
                return super.onTouchEvent(arg0);
            }
        } catch (Exception e) {
        }

        return false;

    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        try {
            if (isCanScroll) {
                return super.onInterceptTouchEvent(arg0);
            }
        } catch (Exception e) {

        }

        return false;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (childrenViews.size() > current) {
            View child = childrenViews.get(current);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            height = child.getMeasuredHeight();
        }
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

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

view1 = UserView(context)
        viewpager.setObjectForPosition(goodView,0)
        view2  = UserView(context)
        viewpager.setObjectForPosition(middleView,1)
        view3 = UserView(context)
        viewpager.setObjectForPosition(badView,2)

pageList.add(view1)       pageList.add(view2)       pageList.add(view3)

监听viewpager

 viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            override fun onPageScrollStateChanged(p0: Int) {
            }

            override fun onPageScrolled(p0: Int, p1: Float, p2: Int) {
            }

            override fun onPageSelected(index: Int) {
                viewpager.resetHeight(index)
                //自己的代码实现
            }
        })

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

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

scrollView.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
            if (scrollY == v.getChildAt(0).measuredHeight - v.measuredHeight) {
                //到底了
                if (isLoadMore) {
                    
                } else {
                   
                }
            }
        })

if (isLoading) {    return}
点赞
收藏
评论区
推荐文章
Easter79 Easter79
2年前
uniapp中使用picker中的注意事项
APP端中picker点击后不弹出:1、请确保picker标签里面嵌套了一个view,并且view里面有值2、请确保picker中的默认值的格式跟该picker类型的值对应例如下面:<viewclass"time_wrap"<inputtype"tex
九路 九路
2年前
一文读懂Android View事件分发机制
AndroidView虽然不是四大组件,但其并不比四大组件的地位低。而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎。ScrollView嵌套RecyclerView(或者ListView)的滑动冲突这种老大难的问题的理论基础就是事件分发机制。事件分发机制面试也会经常被提及,如果你能get到要领,并跟面试官深入的灵魂交流一下,那么一定会让
红橙Darren 红橙Darren
2年前
Android无限广告轮播 - 自定义BannerView
1.概述这其实是我第一篇想写的博客,可能是因为我遇到了太多的坑,那个时候刚入行下了很多Demo发现怎么也改不动,可能是能力有限,这次就做一个具体的实现和彻底的封装。  上次讲了,有了源码分析我们对ViewPager就有了一个大概的了解,那么再来封装成自定义View,就会简单许多,附视频讲解地址:    这里写图片描述2.效果封装2.1
Android事件分发-基础原理和场景分析
和其他平台类似,Android中View的布局是一个树形结构,各个ViewGroup和View是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个View的范围内,这样就不知道哪个View来响应这个事件,为了解决这一问题,就出现了事件分发机制。
Stella981 Stella981
2年前
Less 嵌套
本节我们学习Less中的嵌套,嵌套应该很容易理解,HTML语言中就支持标签的嵌套。我们在使用CSS时,如果想要为多层嵌套的元素设置样式,要么给元素加上一个类选择器或ID选择器,要么使用后代选择器。例如:.xkd{fontsize:14px;}.xkdp{lineheight:25
Stella981 Stella981
2年前
Android客户端图片左右滑动(自动切换)
本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和门户网站都有类似的实现:具体思路:1\.工程中需要添加androidsupportv4.jar,才能使用ViewPager控件.2\.图片的自动切换:可使用Timer或者ScheduledExecutorService,这个有多重方式可以实现.
Stella981 Stella981
2年前
Sass
嵌套规则(NestedRules)Sass允许将一套CSS样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器mainp{color:00ff00;width:97%;.redbox{
Stella981 Stella981
2年前
Android开源项目分类汇总
第一部分个性化控件(View)主要介绍那些不错个性化的View,包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、Color
Easter79 Easter79
2年前
Spring高级应用之注入嵌套Bean
在Spring中,如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean。和普通的Bean一样,使用<bean元素来定义嵌套的Bean,嵌套Bean只对它的外部的Bean有效,Spring容器无法直接访问嵌套的Bean,因此定义嵌套Bean也无需指定id属性。如下配置片段是一个嵌套Bean的示例:<bean id
Stella981 Stella981
2年前
Android 解决ViewPager双层嵌套的滑动问题
原文地址https://www.cnblogs.com/zhujiabin/p/7083290.html(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fzhujiabin%2Fp%2F7083290.html)之前在做自己的一个项目的时候,遇到