想达到此界面的风格
然后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的事件什么时候拦截,什么时候释放,,,一大堆问题搞不定。。。。

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

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

  1. package com.nd.cosplay.ui.social.home;
  2.  
  3. import javax.xml.datatype.Duration;
  4.  
  5. import com.nd.cosplay.R;
  6. import com.nd.cosplay.common.utils.ToastUtil;
  7.  
  8. import android.content.Context;
  9. import android.os.Handler;
  10. import android.util.AttributeSet;
  11. import android.util.Log;
  12. import android.view.LayoutInflater;
  13. import android.view.MotionEvent;
  14. import android.view.View;
  15. import android.widget.AbsListView;
  16. import android.widget.AbsListView.OnScrollListener;
  17. import android.widget.ArrayAdapter;
  18. import android.widget.LinearLayout;
  19. import android.widget.ListView;
  20. import android.widget.ProgressBar;
  21. import android.widget.ScrollView;
  22. import android.widget.TextView;
  23. import android.widget.Toast;
  24.  
  25. /**
  26. * 能够兼容ViewPager的ScrollView
  27. * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题
  28.  
  29. * @File: ScrollViewExtend.java
  30.  
  31. * @Package com.image.indicator.control
  32.  
  33. * @Author Hanyonglu
  34.  
  35. * @Date 2012-6-18 下午01:34:50
  36.  
  37. * [url=home.php?mod=space&uid=85817]@version[/url] V1.0
  38. */
  39. public class ScrollViewExtend extends ScrollView {
  40. public static final int MSG_LOAD = 0x123;// 进行加载信息
  41. public static final int MSG_FINISH = 0x124;// 完成加载信息
  42. LayoutInflater mLayoutInflate;// 用来获得xml的
  43. View mLayoutView;// 我的自定义view
  44. float touchLastY, touchLastX; // 最近那次触屏的Y坐标
  45. int touchDeltaY; // 两次Y坐标的间隔
  46. private LinearLayout childView;
  47.  
  48. LinearLayout mLinearLayout;// 自定义布局中的根布局
  49. ProgressBar mProgressBar;// 自定义布局中的ProgressBar
  50. TextView mTextView;// 自定义布局中的TextView
  51. // 滑动距离及坐标
  52. private float xDistance, yDistance, xLast, yLast;
  53.  
  54. public ScrollViewExtend(Context context, AttributeSet attrs, int defStyle) {
  55. super(context, attrs, defStyle);
  56. init(context);
  57.  
  58. }
  59.  
  60. public ScrollViewExtend(Context context, AttributeSet attrs) {
  61. super(context, attrs);
  62. init(context);
  63. }
  64.  
  65. public ScrollViewExtend(Context context) {
  66. super(context);
  67. init(context);
  68. }
  69.  
  70. public void init(Context context) {// 初始化变量
  71. // 获得布局管理对象
  72. mLayoutInflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  73. // 对自定义布局中的各个组件进行初始化
  74. mLayoutView = mLayoutInflate.inflate(R.layout.load_view, null);
  75. mLinearLayout = (LinearLayout) mLayoutView.findViewById(R.id.load_layout);
  76. mProgressBar = (ProgressBar) mLayoutView.findViewById(R.id.load_progress);
  77. mTextView = (TextView) mLayoutView.findViewById(R.id.load_text);
  78. touchLastY = 0.0f;
  79. touchDeltaY = ;
  80.  
  81. }
  82.  
  83. @Override
  84. public boolean onInterceptTouchEvent(MotionEvent ev) {
  85. switch (ev.getAction()) {
  86. case MotionEvent.ACTION_DOWN:
  87. xDistance = yDistance = 0f;
  88. xLast = ev.getX();
  89. yLast = ev.getY();
  90. break;
  91. case MotionEvent.ACTION_MOVE:
  92. final float curX = ev.getX();
  93. final float curY = ev.getY();
  94.  
  95. xDistance += Math.abs(curX - xLast);
  96. yDistance += Math.abs(curY - yLast);
  97. xLast = curX;
  98. yLast = curY;
  99. // 左右滑动不拦截TouchEvent
  100. if (xDistance > yDistance) {
  101. return false;
  102. }
  103. }
  104.  
  105. return super.onInterceptTouchEvent(ev);
  106. }
  107.  
  108. @Override
  109. public boolean onTouchEvent(MotionEvent ev) {
  110. int action = ev.getAction();
  111. float curY = ev.getY();
  112. switch (action) {
  113. case MotionEvent.ACTION_DOWN:
  114. touchLastY = curY;
  115. break;
  116. case MotionEvent.ACTION_MOVE:
  117. touchDeltaY = (int) (curY - touchLastY);
  118. // 当上拉或者下来的y超过200时候,显示正在加载
  119. if (touchDeltaY > || touchDeltaY < -) {
  120. // getParent().requestDisallowInterceptTouchEvent(true);
  121. // 发送消息显示正在加载
  122. h.sendEmptyMessage(MSG_LOAD);
  123. }
  124. break;
  125. case MotionEvent.ACTION_UP:
  126. h.sendEmptyMessage(MSG_FINISH);
  127. // getParent().requestDisallowInterceptTouchEvent(false);
  128. break;
  129. case MotionEvent.ACTION_CANCEL:
  130. // getParent().requestDisallowInterceptTouchEvent(false);
  131. break;
  132. }
  133. return super.onTouchEvent(ev);
  134. }
  135.  
  136. Handler h = new Handler() {
  137. public void handleMessage(android.os.Message msg) {
  138. if (msg.what == MSG_LOAD) {// 更新
  139. ToastUtil.makeToast(getContext(), "开始加载");
  140.  
  141. mTextView.setText("加载数据");
  142. mProgressBar.setVisibility(View.VISIBLE);
  143. mTextView.setVisibility(View.VISIBLE);
  144. } else if (msg.what == MSG_FINISH) {// 完成
  145. mProgressBar.setVisibility(View.GONE);
  146. mTextView.setText("更新完成");
  147. ToastUtil.makeToast(getContext(), "更新完成");
  148.  
  149. }
  150. };
  151. };
  152.  
  153. }

2、自定义ScrollViewPager控件

  1. package com.nd.cosplay.ui.social.home;
  2.  
  3. import android.content.Context;
  4. import android.support.v4.view.ViewPager;
  5. import android.util.AttributeSet;
  6. import android.view.MotionEvent;
  7. import android.widget.LinearLayout;
  8. import android.widget.RelativeLayout;
  9.  
  10. public class ScrollViewPager extends ViewPager {
  11. ViewPager child_viewpager;
  12. float startX;
  13.  
  14. /**
  15. * @param context
  16. * @param attrs
  17. */
  18. public ScrollViewPager(Context context, AttributeSet attrs) {
  19. super(context, attrs);
  20. }
  21.  
  22. @Override
  23. public boolean onInterceptTouchEvent(MotionEvent arg0) {
  24. int action = arg0.getAction();
  25. switch (action) {
  26. case MotionEvent.ACTION_DOWN:// 按下
  27. startX = arg0.getX();
  28. getParent().requestDisallowInterceptTouchEvent(true);
  29. break;
  30. // 滑动,在此对里层viewpager的第一页和最后一页滑动做处理
  31. case MotionEvent.ACTION_MOVE:
  32. if (startX == arg0.getX()) {
  33. if ( == getCurrentItem() || getCurrentItem() == getAdapter().getCount() - ) {
  34. getParent().requestDisallowInterceptTouchEvent(false);
  35. }
  36. }
  37. // 里层viewpager已经是最后一页,此时继续向右滑(手指从右往左滑)
  38. else if (startX > arg0.getX()) {
  39. if (getCurrentItem() == getAdapter().getCount() - ) {
  40. getParent().requestDisallowInterceptTouchEvent(false);
  41. }
  42. }
  43. // 里层viewpager已经是第一页,此时继续向左滑(手指从左往右滑)
  44. else if (startX < arg0.getX()) {
  45. if (getCurrentItem() == ) {
  46. getParent().requestDisallowInterceptTouchEvent(false);
  47. }
  48. } else {
  49. getParent().requestDisallowInterceptTouchEvent(true);
  50. }
  51. break;
  52. case MotionEvent.ACTION_UP:// 抬起
  53. case MotionEvent.ACTION_CANCEL:
  54. getParent().requestDisallowInterceptTouchEvent(false);
  55. break;
  56. }
  57.  
  58. return super.onInterceptTouchEvent(arg0);
  59. }
  60.  
  61. }

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/sc_main"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical" >
  7.  
  8. <com.nd.cosplay.ui.social.home.ScrollViewExtend
  9. android:id="@+id/scrollView1"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:fillViewport="true" >
  13.  
  14. <LinearLayout
  15. android:id="@+id/mylayout"
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content"
  18. android:orientation="vertical" >
  19. <!-- header为固定的头 -->
  20. <include layout="@layout/social_user_homepage_header" />
  21.  
  22. <com.nd.cosplay.ui.social.home.ScrollViewPager
  23. android:id="@+id/child_viewpager"
  24. android:layout_width="fill_parent"
  25. android:layout_height="800dp" >
  26. </com.nd.cosplay.ui.social.home.ScrollViewPager>
  27. </LinearLayout>
  28. </com.nd.cosplay.ui.social.home.ScrollViewExtend>
  29.  
  30. </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. template_11实参演绎

    1,演绎过程匹配类型A(来自实参的类型),参数化类型P(行参参数声明)如果被声明的参数是一个引用声明g(T& )那么P就是所引用类型T:f(T)中P就是所声明的参数类: decay指从数组和函 ...

  2. OD常用断点

    OD常用断点 很全很全 常用断点 拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWi ...

  3. 第三章 用SDK编译出第一个在Linux下的软件界面

    第三章 用SDK编译出第一个在Linux下的软件界面 先创建一个工程目录“mkdir project1”,进入目录,创建main.cpp文件,编写代码如下: 代码内容暂时可以先不理解,先让程序跑起来再 ...

  4. PHP 魔术方法 __get __set (二)

    慢慢长寻夜,明月高空挂 __get() - 读取不可访问属性的值时,__get() 会被调用 __set() - 在给不可访问属性赋值时,__set() 会被调用 <?php /** * 清晰的 ...

  5. 【解惑】深入jar包:从jar包中读取资源文件

    [解惑]深入jar包:从jar包中读取资源文件 http://hxraid.iteye.com/blog/483115 TransferData组件的spring配置文件路径:/D:/develop/ ...

  6. 一种C# TCP异步编程中遇到的问题

    最近在维护公司的一个socket服务端工具,该工具主要是提供两个socket server服务,对两端连接的程序进行数据的透明转发. 程序运行期间,遇到一个问题,程序的一端是GPRS设备,众所周知,G ...

  7. 解决svn “clean up" 失败

    解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.db 3.将sqlite3.exe放到.svn的同级目录 4.启动cmd执行sqlite3 ...

  8. CentOS 安装jdk1.7 64位

    [root@localhost ~]# java -versionjava version "1.6.0"OpenJDK Runtime Environment (build 1. ...

  9. try catch finally 关闭流标准的写法

    平常开发中,都知道要在finlly里关闭流,但是有时finlly里代码不当,会引起另外的异常. 以下是看struts2源代码看到的,随手记录下. 有两点注意: (1)判断流是否为空. (2)filly ...

  10. Ecshop与Jquery冲突的完美解决方案

    ecshop把AJAX事件和JSON解析的模块放在common/transport.js之中,可以说它也有自己封装的一套工具,这其实是很正常的.   但恰恰的,在封装JSON各种方法的同时对objec ...