文档章节

解决ListView与SwipeRefreshLayout滑动冲突问题

hkceey
 hkceey
发布于 2016/07/28 11:06
字数 400
阅读 99
收藏 0

当SwipeRefreshLayout只有ListView一个子view的时候是没有任何问题的,但如果不是一个子view就会出现问题了,向上滑动ListView一切正常,向下滑动的时候就会出现还没有滑倒ListView顶部就触发下拉刷新的动作了。

从SwipeRefreshLayout源码可以看到在onInterceptTouchEvent里面有这样的一段代码

if (!isEnabled() || mReturningToStart || canChildScrollUp() || mRefreshing) {
        // Fail fast if we're not in a state where a swipe is possible
        return false;
   }

其中有个canChildScrollUp方法

public boolean canChildScrollUp() {
        if (android.os.Build.VERSION.SDK_INT < 14) {
            if (mTarget instanceof AbsListView) {
                final AbsListView absListView = (AbsListView) mTarget;
                return absListView.getChildCount() > 0
                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                        .getTop() < absListView.getPaddingTop());
            } else {
                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;
            }
        } else {
            return ViewCompat.canScrollVertically(mTarget, -1);
        }
    }

决定子view 能否滑动就再canChildScrollUp方法中,所以我们只需写一个类继承SwipeRefreshLayout,然后重写该方法即可

public class SimpleSwipeRefreshLayout extends SwipeRefreshLayout {

    private View view;
    public SimpleSwipeRefreshLayout(Context context) {
        super(context);
    }

    public SimpleSwipeRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setViewGroup(View view) {
        this.view = view;
    }

    @Override
    public boolean canChildScrollUp() {
        if (view != null && view instanceof AbsListView) {
            final AbsListView absListView = (AbsListView) view;
            return absListView.getChildCount() > 0
                    && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                    .getTop() < absListView.getPaddingTop());
        }
        return super.canChildScrollUp();
    }
}

但有时你发现并不如意,再对ListView设置如下OnScrollListener事件

listView.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
    boolean enable = false;
    if(listView != null && listView.getChildCount() > 0){
        // 检查listView第一个item是否可见
        boolean firstItemVisible = listView.getFirstVisiblePosition() == 0;
        // 检查第一个item的顶部是否可见
        boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0;
        // 启用或者禁用SwipeRefreshLayout刷新标识
        enable = firstItemVisible && topOfFirstItemVisible;
    }else if (listView != null && listView.getChildCount() == 0) {
        // 没有数据的时候允许刷新
        enable = true;
    }
    // 把标识传给swipeRefreshLayout
    swipeRefreshLayout.setEnabled(enable);
}});

你再看看,问题是否解决了!

© 著作权归作者所有

共有 人打赏支持
hkceey
粉丝 0
博文 14
码字总数 3146
作品 0
海口
程序员
滑动事件总结(刷新,加载更多,嵌套滑动)

下拉刷新 在Api21之前,ListView和GridView的使用相当普遍,包括下拉刷新我们也可以使用它,利用他的addHeaderView()和addFooterView()方法,或者使用父级中隐藏View的方式来实现; 在A...

卐字旗下的余晖
2016/06/07
101
0
在SwipeRefreshLayout中加入多个子View

在SwipeRefreshLayout中加入多个子View 小憩之地2014-09-29482 阅读 Android SwipeRefreshLayout是由Android官方提供的下拉刷新Widget。最低在v4中可用。 最近使用了一下,发现虽然是官方出品...

小憩之地
2014/09/29
0
0
Android滑动冲突处理

在我们平时项目开发的过程中,是不是会遇到滑动View之间的相互嵌套,比如外部的Scrollview或SwipeRefreshLayout嵌套内部的Viewpager或横向Recyclerview,如外部Viewpager嵌套内部Viewpager。...

翻滚吧李博
2017/12/14
0
0
android SwipeRefreshLayout中嵌套listview,listview不能滑动?

在SwipeRefreshLayout 中嵌套了listview,但listview却不能滑动,但当给listview添加了headview之后,又能滑动了,why?现在是不想要添加headview,该如何实现?...

MrHello
2015/09/10
179
0
实现Material风格的滑动刷新Swipe to Refresh

Material Design用户界面指南中非常棒的一个设计是Swipe to Refresh UI pattern。实际上你可能已经看到或者用过这种效果了。在很多热门的app中都有这种效果,比facebok、 Google Newsstand, ...

gaoyangsimida
2016/04/18
44
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell-日志脚本小实验

1.查找日志2018-8-15,求得那一分钟访问量最大。 #/bin/bash#from cc#2018-8-15#2018-08-15.log 哪一分钟 访问量 最大for d in `ls /data/nginx/logs/`doif [ -a 2018-08-15...

chencheng-linux
昨天
0
0
Android中的设计模式之状态模式

参考 《设计模式:可复用面向对象软件的基础 》5.8 State 状态 对象行为型模式 《Android源码设计模式解析与实战》第7章 随遇而安--状态模式 意图 允许一个对象在其内部状态改变时改变它的行...

newtrek
昨天
0
0
xshell端 vim没有颜色

说明 使用xshell连接服务器的时候,使用vim打开文档没有颜色 解决方法: 1.在更目录home或者etc下找到vim的配置文件vimrc 2.vim打开它找个坑,添加下面这个东西 set t_Co=256 3.保存退出,就...

杉下
昨天
0
0
spring 资料

spring boot http://www.ityouknow.com/springboot/2016/01/06/spring-boot-quick-start.html

zaolonglei
昨天
2
0
TypeScript基础入门 - 函数 - 简介

转载 TypeScript基础入门 - 函数 - 简介 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.1.6 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接...

durban
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部