博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android ScrollView+ViewPager+PullToRefreshListView
阅读量:5011 次
发布时间:2019-06-12

本文共 8192 字,大约阅读时间需要 27 分钟。

想达到此界面的风格

然后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配置文件为

 

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

你可能感兴趣的文章
JS基础回顾,小练习(判断数组,以及函数)
查看>>
多任务——进程
查看>>
WCF:如何将net.tcp协议寄宿到IIS
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
php_soap扩展应用
查看>>
第二百三十一节,Bootstrap 介绍
查看>>
vi/vim 三种模式的操作
查看>>
JAVA面向对象三大特性总结
查看>>
guid
查看>>
Python中出现“TabError: inconsistent use of tabs and spaces in indentation”问题的解决
查看>>
ajax请求
查看>>
js学习总结----DOM增删改和应用
查看>>
希尔伯特矩阵(Hilbert matrix)
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>
Mac必备软件推荐
查看>>
Android Gson深入分析
查看>>