文档章节

解决ListView与SwipeRefreshLayout滑动冲突问题

hkceey
 hkceey
发布于 2016/07/28 11:06
字数 400
阅读 111
收藏 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
195
0
实现Material风格的滑动刷新Swipe to Refresh

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

gaoyangsimida
2016/04/18
44
0

没有更多内容

加载失败,请刷新页面

加载更多

我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

问题终结者
10分钟前
2
0
Java 使用 gson 对 json 根据 key 键进行排序

引入Google的gson jar <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version>......

yh32
11分钟前
1
0
Vue.use源码解析

什么是Vue插件 关于什么是Vue插件大家可以去看官网的解释 ,总得来说就是提供一个全局注册/调用的能力。 怎么用 我们以Weex为例。 首先有一个toast.js const Toast = {}Toast.install = (Vu...

peakedness丶
18分钟前
1
0
mybatis学习(2)

http://www.mybatis.org/spring/zh/factorybean.html 参考mybatis官网 Mybatis集成Spring: 使用Spring的IOC,将sqlSession(存在事物),交给Spring管理。 1.依赖jar包 <dependency> <g......

杨健-YJ
28分钟前
2
0
ES的性能优化

我们在很多场景下会用到ES帮助我们解决搜索问题,但是很多人了解只是停留在表面,如何深入的使用ES,并做针对性的性能优化呢? 批量提交 当大量的写任务时,可以采用批量提交的方案,但是需要...

春哥大魔王的博客
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部