想达到此界面的风格
然后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 = ; } @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 > || touchDeltaY < -) {
// 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 ( == getCurrentItem() || getCurrentItem() == getAdapter().getCount() - ) {
getParent().requestDisallowInterceptTouchEvent(false);
}
}
// 里层viewpager已经是最后一页,此时继续向右滑(手指从右往左滑)
else if (startX > arg0.getX()) {
if (getCurrentItem() == getAdapter().getCount() - ) {
getParent().requestDisallowInterceptTouchEvent(false);
}
}
// 里层viewpager已经是第一页,此时继续向左滑(手指从左往右滑)
else if (startX < arg0.getX()) {
if (getCurrentItem() == ) {
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>

Android ScrollView+ViewPager+PullToRefreshListView的更多相关文章

  1. Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)

    Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...

  2. Android中viewPager的一两点使用

    Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...

  3. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  4. android之ViewPager

    在android中ViewPager是非常常用的控件.它在android.support.v4.view.ViewPager下.你们自己可以进http://developer.android.com/ ...

  5. Android listview viewpager解决冲突 滑动

    Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决   在listview 上使用 addHeaderView 在第 ...

  6. Android 使用ViewPager实现左右循环滑动图片

    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1.    首先看一 ...

  7. Android ScrollView用法

    Android ScrollView用法 今天试着使用了一下Android的滚轮,以下是一个小小的测试,读取测试文件,主要是使用scrollTo函数和getScrollY(),程序点击BUTTON按钮 ...

  8. android使用ViewPager实现欢迎引导页

    android使用ViewPager实现欢迎引导页 大多数APP第一次启动的时候,都会有一个引导界面,左右滑动,到最后一张,用户点击才再次进入主界面.当第二次启动的时候,则直接进入主界面. 这种效果一 ...

  9. android下ViewPager的使用,带下部选项栏的切换动画

    (文章针对类似我这种初学者,大神看到不要嘲笑) 演示 我的规矩是先上GIF动画效果(Linux下用转的GIF,清晰度还可以但是不知道为什么放博客上,界面会这么大): 代码: android中有View ...

随机推荐

  1. 创建型模式——Builder

    1.意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.结构 3.参与者 Builder为创建一个Product对象的各个部件指定抽象接口 ConcreteBuild ...

  2. JAVA_SE复习(OOP2)

    面向对象编程(二) 一.static 关键字 静态属性 1.不能覆盖静态方法.要被覆盖的方法必须是非静态的.在继承链中具有相同方法名的两个静态方法是两个互相独立的类方法.调用子类的静态方法只是将父类的 ...

  3. CentOs Linux 分区建议

    硬盘分区方案 在计算机上安装Linux系统,对硬盘进行分区是一个非常重要的步骤,下面介绍几个分区方案. (1)方案1(桌面)/boot:用来存放与Linux系统启动有关的程序,比如启动引导装载程序等, ...

  4. 正则应用—queryURLParameter()

    在项目中,我们做详情页的时候,需要获取到用户从哪里来点击进来,获取到用户的点击地址,根据不同的地址传进的参数向服务器获取不同的数据,然后加载不同的详情页面. 大部分企业都采用字符串截取的方式,quer ...

  5. 設定 Bootstrap/SASS/Bower/gulp (Windows平台)

    請注意:在進行以下步驟前,你會需要先安裝git,可以參考這篇 git安裝教學 前言 時至今日,幾乎每個人都在討論bootstrap.less 或 sass.我們知道它們是比較新的前端技術,而且有開始愈 ...

  6. 1018. Public Bike Management (30)

    时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue There is a public bike service i ...

  7. Have Fun with Numbers (大数)

    Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, wit ...

  8. ISBN

    问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位 ...

  9. Kinetic使用注意点--ellipse

    new Ellipse(config) 参数: config:包含所有配置项的对象. { radius: "半径,可以用数字a.数组[a,b]或对象{x:a,y:b}来表示" } ...

  10. Session_set_save_handler 之 文本模式实现

    1.构建session抽象类,实现Session_set_save_hanlder函数必须的基础函数 <?php /* 实现session利用文件形式或者数据库等其它形式进行存储操作 * aut ...