ViewPager+Fragment((后面的包含在前面的一个Fragment中)ViewPager+Fragment)

** 最近在研究一个有意思的功能,就是在Activity中使用ViewPager,在此ViewPager(1)中存放多个Fragment,在第一个Fragment中使用ViewPager(2),在这个ViewPager中在去存放多个Fragment。并且实现了每个ViewPager都用导航条!
首先如果你要(ˇ?ˇ) 想实现ViewPager的双层嵌套,那么你就的处理ViewPager之间的滑动冲突,这里涉及到一个知识点,叫做事件分发机制。
这个事件分发机制这里不做研究,有兴趣的可以百度或者查阅资料!我解决冲突的方式时自定义子Viewpager(2),通过重写该Viewpager的事件分发方法消除滑动冲突
**

//这里是我重写的代码
public class FirstBasePager extends ViewPager {
    public FirstBasePager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    /** 触摸时按下的点 **/
    PointF downpoint = new PointF();
    /** 触摸的当前的点 **/
    PointF curF = new PointF();
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return super.onInterceptTouchEvent(event);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (getChildCount() <= 1) {
            return super.onTouchEvent(event);
        }
        curF.x = event.getX();
        curF.y = event.getY();
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            downpoint.x = event.getX();
            downpoint.y = event.getY();
            this.getParent().requestDisallowInterceptTouchEvent(true);
                    }
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            /**在第一页向后一页滑动*/
            if (downpoint.x>=curF.x) {
                if (getCurrentItem()==0||getCurrentItem()<getAdapter().getCount()-1) {
            this.getParent().requestDisallowInterceptTouchEvent(true);
                }
/**在最后一页*/          if(getCurrentItem()==getAdapter().getCount()-1){        this.getParent().requestDisallowInterceptTouchEvent(false);
                }
            }
            /**在最后一页向前一页滑动*/
            if (downpoint.x<=curF.x) {
                if (getCurrentItem()<=getAdapter().getCount()-1) {              this.getParent().requestDisallowInterceptTouchEvent(true);
                }
                /**在第一页*/
                if (getCurrentItem()==0) {  this.getParent().requestDisallowInterceptTouchEvent(false);
                }
            }   
        }
        if (event.getAction() == MotionEvent.ACTION_UP
                || event.getAction() == MotionEvent.ACTION_CANCEL) {
            if (downpoint.x == curF.x && downpoint.y == curF.y) {
                /** 这是一个点击事件 */
                return true;
            }       this.getParent().requestDisallowInterceptTouchEvent(true);
        }
        super.onTouchEvent(event);
        return true;
    }
}

注意在子ViewPager的布局中一定要使用这个自定义的Viewpager,为了解决Fragment在每次执行onCreateView方法导致第二次滑动到含有子Viewpager页面时,页面的内容消失问题需要在父Viewpager关联的Adapter中重写destroyItem方法

/**删除super的调用防止在滑动时销毁原来视图中的问题
 * 删除super后不会出现第二次滑动到第一页时第一页的内容被销毁
 * */
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) { }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值