首页 > 学院 > 开发设计 > 正文

PullToRefreshScrollView嵌套viewpager

2019-11-09 14:44:05
字体:
来源:转载
供稿:网友

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

实现方式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()方法,
@OverridePRotected 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),代码如下:

@Overridepublic 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事件中,这样就可以实现功能需求啦。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表