当前位置: 首页 > news >正文

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>

 

转载于:https://www.cnblogs.com/zhujiabin/p/5772740.html

相关文章:

  • CF #367 DIV2 E
  • dl标签和table标签
  • sql 分割字符串 存储过程
  • GUI之绘画控制
  • jmc远程监控java服务
  • 制作根文件系统的经验
  • SharePoint UserProfileService 接口列表 注解
  • Liferay 6.2 改造系列之二十二:如何发布WAR包
  • 关于投资那些事
  • FreeRTOS下的串口编程
  • YII2.0邮箱发送
  • 格式是否正确输入年、月、日判断
  • Learn GIT
  • Redis常用命令入门4:集合类型
  • 工作反思
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 「译」Node.js Streams 基础
  • 【笔记】你不知道的JS读书笔记——Promise
  • CODING 缺陷管理功能正式开始公测
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Effective Java 笔记(一)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • jquery ajax学习笔记
  • js学习笔记
  • node 版本过低
  • React-redux的原理以及使用
  • spring security oauth2 password授权模式
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 从输入URL到页面加载发生了什么
  • 聚簇索引和非聚簇索引
  • 如何利用MongoDB打造TOP榜小程序
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 详解移动APP与web APP的区别
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • $refs 、$nextTic、动态组件、name的使用
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (差分)胡桃爱原石
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (南京观海微电子)——I3C协议介绍
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (轉貼) UML中文FAQ (OO) (UML)
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ***利用Ms05002溢出找“肉鸡
  • **CI中自动类加载的用法总结
  • .bat文件调用java类的main方法
  • .Net Core缓存组件(MemoryCache)源码解析