PullToRefreshScrollView嵌套viewpager

项目需要实现功能:页面下拉刷新,上拉加载,页面内部有无线轮播。

实现方式1:

github上下载一个无限轮播的控件,嵌套到PullToRefreshScrollView中。

<com.handmark.pulltorefresh.library.PullToRefreshScrollView

    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--第一个轮播-->
  
        <com.kevin.loopview.AdLoopView
        android:id="@+id/main_act_adloopview"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        >
    </com.kevin.loopview.AdLoopView>   


</com.handmark.pulltorefresh.library.PullToRefreshScrollView>

这样写的问题是,viewpager不显示。
然后我重写了viewpager的onmeasure()方法,
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

   int height = 0;
   for(int i = 0; i < getChildCount(); i++) {
      View child = getChildAt(i);
      child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(300, MeasureSpec.EXACTLY));
      int h = child.getMeasuredHeight();
      if(h > height) height = h;
   }

   heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

轮播图显示出来了,可是高度不对。

然后 在控件外面再套层布局,如下:

<com.handmark.pulltorefresh.library.PullToRefreshScrollView

    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--第一个轮播-->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <com.kevin.loopview.AdLoopView
        android:id="@+id/main_act_adloopview"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        >
    </com.kevin.loopview.AdLoopView>
        <!--<appliaction.yll.com.myapplication.ui.view.MyPager-->
            <!--android:id="@+id/search_viewpager"-->
            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="300dp"-->
            <!--android:background="@color/red"-->
            <!--&gt;</appliaction.yll.com.myapplication.ui.view.MyPager>-->
    </LinearLayout>


</com.handmark.pulltorefresh.library.PullToRefreshScrollView>

这样,viewpager显示正常了,但是上下滑动时有事件冲突。

只好改写viewpager的dispatchTouchEvent(MotionEvent ev),代码如下:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    int action = MotionEventCompat.getActionMasked(ev);
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            if(isAutoScroll){
                isStopByTouch = true;
                stopAutoLoop();
                Log.d("dddd", "dispatchTouchEvent: down1");
            }
            Log.d("dddd", "dispatchTouchEvent: down2");
            x = ev.getX();
            y = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            float moveX = ev.getX();
            float moveY = ev.getY();
            if(Math.abs(moveY- y)>Math.abs(moveX- x)){
                getParent().requestDisallowInterceptTouchEvent(false);
                if(isStopByTouch){
                    startAutoLoop(mInterval);
                    Log.d("dddd", "dispatchTouchEvent: up1");
                }
              break;
            }else{
                getParent().requestDisallowInterceptTouchEvent(true);
            }

            Log.d("dddd", "dispatchTouchEvent: move");
            break;

        case MotionEvent.ACTION_UP:
            getParent().requestDisallowInterceptTouchEvent(true);
            if(isStopByTouch){
                startAutoLoop(mInterval);
                Log.d("dddd", "dispatchTouchEvent: up1");
            }
            Log.d("dddd", "dispatchTouchEvent: up2");

            break;

    }
在这里遇到问题————在竖向滑动的时候,父控件可以拦截事件,viewpager获取不到up事件,无法让轮播图startAotoLoop(),想到办法就是将这个方法放到move事件中,这样就可以实现功能需求啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值