Android中给Listview的HeadView加ViewPager自动轮播图,解决滑动冲突

项目的UE图中页面顶部是个轮播图,下面是个Listview,轮播图要跟着listview一起滑动,因而产生了viewpager滑动冲突,如果外层使用ScollView又要

处理listview的滑动事件,还有其上拉加载下拉刷新,中和考虑后在HeadView中加入ViewPager轮播,但是加入后滑动冲突,viewpager左右滑动无效

成下拉事件.

于是重写ViewPager

public class MyViewPager extends ViewPager{
    /** 触摸时按下的点 **/
    PointF downP = new PointF();
    /** 触摸时当前的点 **/
    PointF curP = new PointF();
    public MyViewPager(Context context) {
        super(context);
    }

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if(arg0.getAction() == MotionEvent.ACTION_DOWN){
            //记录按下时候的坐标
            //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
            downP.x = arg0.getX();
            downP.y = arg0.getY();
            //此句代码是为了通知他的父Listview现在进行的是本控件的操作,不要对我的操作进行干扰
            getParent().requestDisallowInterceptTouchEvent(true);
        }
        if (arg0.getAction()==MotionEvent.ACTION_MOVE){
            getParent().requestDisallowInterceptTouchEvent(true);
            L.e("滑动"+"move");
            curP.x = arg0.getX();
            curP.y = arg0.getY();
            getParent().requestDisallowInterceptTouchEvent(true);
            if (downP.x-curP.x>0){
                setCurrentItem(getCurrentItem() + 1);
                L.e("左滑动" + downP.x + "+" + curP.x);
                return true;
            }
            if (downP.x-curP.x<0){
                setCurrentItem(getCurrentItem() -1);
                L.e("右滑动"+downP.x+"+"+curP.x);
                return true;
            }
        }
        if(arg0.getAction() == MotionEvent.ACTION_UP){
            curP.x = arg0.getX();
            curP.y = arg0.getY();
            getParent().requestDisallowInterceptTouchEvent(true);
            if (downP.x-curP.x>0){
                setCurrentItem(getCurrentItem() + 1);
                L.e("左滑动" + downP.x + "+" + curP.x);
                return true;
            }
            if (downP.x-curP.x<0){
                setCurrentItem(getCurrentItem() -1);
                L.e("右滑动"+downP.x+"+"+curP.x);
                return true;
            }
        }
        return super.onInterceptTouchEvent(arg0);
    }
}
onInterceptTouchEvent中处理Viewpager的滑动事件,同时在代码中设置了Viewpager的onTouch事件

 /** 触摸时按下的点 **/
    PointF downP = new PointF();
    /** 触摸时当前的点 **/
    PointF curP = new PointF();
    private void setView() {
        iv_back.setOnClickListener(this);
        mVp.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent arg0) {
                isTouch=true;
                switch (arg0.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        downP.x = arg0.getX();
                        downP.y = arg0.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (downP.x-curP.x>0){
                            L.e("左滑动"+downP.x+"+"+curP.x);
                            isTouch=false;
                        }
                        if (downP.x-curP.x<0){
                            L.e("右滑动"+downP.x+"+"+curP.x);
                            isTouch=false;
                        }
                        break;
                    case MotionEvent.ACTION_CANCEL:
                    case MotionEvent.ACTION_UP:
                        curP.x = arg0.getX();
                        curP.y = arg0.getY();
                        if (downP.x-curP.x>0){
                            L.e("左滑动"+downP.x+"+"+curP.x);
                            isTouch=false;
                        }
                        if (downP.x-curP.x<0){
                            L.e("右滑动"+downP.x+"+"+curP.x);
                            isTouch=false;
                        }
                        break;
                }
                return false;
            }
        });

只是部分代码,处理的viewpager的滑动事件

 View headView=LayoutInflater.from(RaceActivity.this).inflate(R.layout.layout_listview_head_banner,null);
        AbsListView.LayoutParams params=new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,DisplayUtil.dp2px(150));
        headView.setLayoutParams(params);
        mVp= (MyViewPager) headView.findViewById(R.id.vp);
        tv_title= (TextView) headView.findViewById(R.id.tv_title);
        mLinearLayout= (LinearLayout) headView.findViewById(R.id.ll_container);
        mWhiteView=headView.findViewById(R.id.v_guide_white_point);
        lv_race.addHeaderView(headView);

给listview添加headview
由于轮播是由handler控制的,程序还待优化,只附上Viewpager的事件处理主要代码,仅供参考

你可能感兴趣的:(android,android,viewpager,ListView,控件,Studio)