• Android ScrollView+ViewPager+PullToRefreshListView


    想达到此界面的风格
    然后ViewPage里面第一个Fragment是一个瀑布流 这个瀑布流要有加载跟多

    在ScrollView中,嵌套ViewPager,在ViewPager的每页使用Fragment并且Fragment中使用PullToRefreshListView,整体放在Fragment中banner相当于header
    需要达到要求:
    1、当下拉banner时,要求可以重新加载当前ViewPager显示页签中PullToRefreshListView的内容
    2、当在PullToRefreshListView下拉时候,触发ScrollView中的事件,此事件显示“正在刷新的进度条”,此进度条放在banner上面
    3、当用户在ViewPager的区域向上滑动的时候,scrollview的中的banner要求能自动顶上去,当banner不可见的时候,上下滑动控制在viewpager中4、当用户在ViewPager的区域向下滑动的时候,如果scrollview的中的banner不可见,则滑动区域在viewpager中下滑;如果viewpager中滑动到一定程度的时候就相应scrollview的滑动,这样banner可以再现出来

    我现在的问题是:
    1、在ViewPager中做上滑的时候,有时header顶不上去,即滑动区域在viewpager中,
    2、在ViewPager中做下滑的时候,有时heade下不来,即滑动区域在viewpager中,

    要怎么拦截事件,不明白了请各位同学多指教
    http://www.eoeandroid.com/thread-549583-1-1.html 此贴说可以这样做,但是我想问的是监听ScrollView滑动位置怎么写,在什么时候拦截tab事件,ViewPager的事件什么时候拦截,什么时候释放,,,一大堆问题搞不定。。。。

    步奏是这样的(ScrollView)先监听ScrollView滑动的位置(要做下拉刷新)当过了banner下面的Tab时就把事件拦截释放掉   让ViewPager来获取和分发事件   ViewPager的高度要计算到和显示区域一样大就是要包括上面banner的高度,因为后面banner要顶上去  回拉的时候记得监听是否到了item第一项  要把事件全部还给ScrollView  ScrollView是不会拦截点解事件的 所以没有问题  这个东西的难点就是把事件搞清楚   View的区域和高度要弄清楚 

    我现在的代码:
    1、自定义ScrollViewExtend控件

    package com.nd.cosplay.ui.social.home;
    
    import javax.xml.datatype.Duration;
    
    import com.nd.cosplay.R;
    import com.nd.cosplay.common.utils.ToastUtil;
    
    import android.content.Context;
    import android.os.Handler;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.AbsListView;
    import android.widget.AbsListView.OnScrollListener;
    import android.widget.ArrayAdapter;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.ProgressBar;
    import android.widget.ScrollView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    /** 
     * 能够兼容ViewPager的ScrollView 
     * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题 
     
     * @File: ScrollViewExtend.java 
     
     * @Package com.image.indicator.control 
     
     * @Author Hanyonglu 
     
     * @Date 2012-6-18 下午01:34:50 
     
     * [url=home.php?mod=space&uid=85817]@version[/url] V1.0 
     */
    public class ScrollViewExtend extends ScrollView {
        public static final int MSG_LOAD = 0x123;// 进行加载信息
        public static final int MSG_FINISH = 0x124;// 完成加载信息
        LayoutInflater mLayoutInflate;// 用来获得xml的
        View mLayoutView;// 我的自定义view
        float touchLastY, touchLastX; // 最近那次触屏的Y坐标
        int touchDeltaY; // 两次Y坐标的间隔
        private LinearLayout childView;
    
        LinearLayout mLinearLayout;// 自定义布局中的根布局
        ProgressBar mProgressBar;// 自定义布局中的ProgressBar
        TextView mTextView;// 自定义布局中的TextView
        // 滑动距离及坐标
        private float xDistance, yDistance, xLast, yLast;
    
        public ScrollViewExtend(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(context);
    
        }
    
        public ScrollViewExtend(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public ScrollViewExtend(Context context) {
            super(context);
            init(context);
        }
    
        public void init(Context context) {// 初始化变量
            // 获得布局管理对象
            mLayoutInflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            // 对自定义布局中的各个组件进行初始化
            mLayoutView = mLayoutInflate.inflate(R.layout.load_view, null);
            mLinearLayout = (LinearLayout) mLayoutView.findViewById(R.id.load_layout);
            mProgressBar = (ProgressBar) mLayoutView.findViewById(R.id.load_progress);
            mTextView = (TextView) mLayoutView.findViewById(R.id.load_text);
            touchLastY = 0.0f;
            touchDeltaY = 0;
    
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    xDistance = yDistance = 0f;
                    xLast = ev.getX();
                    yLast = ev.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    final float curX = ev.getX();
                    final float curY = ev.getY();
    
                    xDistance += Math.abs(curX - xLast);
                    yDistance += Math.abs(curY - yLast);
                    xLast = curX;
                    yLast = curY;
                    // 左右滑动不拦截TouchEvent
                    if (xDistance > yDistance) {
                        return false;
                    }
            }
    
            return super.onInterceptTouchEvent(ev);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            int action = ev.getAction();
            float curY = ev.getY();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    touchLastY = curY;
                    break;
                case MotionEvent.ACTION_MOVE:
                    touchDeltaY = (int) (curY - touchLastY);
                    // 当上拉或者下来的y超过200时候,显示正在加载
                    if (touchDeltaY > 200 || touchDeltaY < -200) {
                        // getParent().requestDisallowInterceptTouchEvent(true);
                        // 发送消息显示正在加载
                        h.sendEmptyMessage(MSG_LOAD);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    h.sendEmptyMessage(MSG_FINISH);
                    // getParent().requestDisallowInterceptTouchEvent(false);
                    break;
                case MotionEvent.ACTION_CANCEL:
                    // getParent().requestDisallowInterceptTouchEvent(false);
                    break;
            }
            return super.onTouchEvent(ev);
        }
    
        Handler h = new Handler() {
            public void handleMessage(android.os.Message msg) {
                if (msg.what == MSG_LOAD) {// 更新
                    ToastUtil.makeToast(getContext(), "开始加载");
    
                    mTextView.setText("加载数据");
                    mProgressBar.setVisibility(View.VISIBLE);
                    mTextView.setVisibility(View.VISIBLE);
                } else if (msg.what == MSG_FINISH) {// 完成
                    mProgressBar.setVisibility(View.GONE);
                    mTextView.setText("更新完成");
                    ToastUtil.makeToast(getContext(), "更新完成");
    
                }
            };
        };
    
    }

    2、自定义ScrollViewPager控件

    package com.nd.cosplay.ui.social.home;
    
    import android.content.Context;
    import android.support.v4.view.ViewPager;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    
    public class ScrollViewPager extends ViewPager {
        ViewPager child_viewpager;
        float startX;
    
        /** 
        * @param context 
        * @param attrs 
        */
        public ScrollViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent arg0) {
            int action = arg0.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:// 按下
                    startX = arg0.getX();
                    getParent().requestDisallowInterceptTouchEvent(true);
                    break;
                // 滑动,在此对里层viewpager的第一页和最后一页滑动做处理
                case MotionEvent.ACTION_MOVE:
                    if (startX == arg0.getX()) {
                        if (0 == getCurrentItem() || getCurrentItem() == getAdapter().getCount() - 1) {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    }
                    // 里层viewpager已经是最后一页,此时继续向右滑(手指从右往左滑)
                    else if (startX > arg0.getX()) {
                        if (getCurrentItem() == getAdapter().getCount() - 1) {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    }
                    // 里层viewpager已经是第一页,此时继续向左滑(手指从左往右滑)
                    else if (startX < arg0.getX()) {
                        if (getCurrentItem() == 0) {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    } else {
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                    break;
                case MotionEvent.ACTION_UP:// 抬起
                case MotionEvent.ACTION_CANCEL:
                    getParent().requestDisallowInterceptTouchEvent(false);
                    break;
            }
    
            return super.onInterceptTouchEvent(arg0);
        }
    
    }

    3、总的界面放在一个Fragment中,此xml配置文件为

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/sc_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <com.nd.cosplay.ui.social.home.ScrollViewExtend
            android:id="@+id/scrollView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fillViewport="true" >
    
            <LinearLayout
                android:id="@+id/mylayout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
                            <!-- header为固定的头 -->
                <include layout="@layout/social_user_homepage_header" />
    
                <com.nd.cosplay.ui.social.home.ScrollViewPager
                    android:id="@+id/child_viewpager"
                    android:layout_width="fill_parent"
                    android:layout_height="800dp" >
                </com.nd.cosplay.ui.social.home.ScrollViewPager>
            </LinearLayout>
        </com.nd.cosplay.ui.social.home.ScrollViewExtend>
    
    </LinearLayout>
  • 相关阅读:
    CentOS 7 配置hadoop(五) 配置sqoop(伪分布)
    CentOS 7 配置hadoop(四) 配置hive(伪分布)
    CentOS 7 配置hadoop(三) 配置hbase(伪分布)
    java高级之NIO
    字符编码与序列化
    java高级之IO流 -2
    java中的值传递和引用传递
    事务相关知识点
    mybatis中批量更新sql语句,trim、foreach标签,varchar定义理解
    java IO流之File类的使用
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5772740.html
Copyright © 2020-2023  润新知