`

SwipeRefreshLayout 和RecyclerView下拉冲突

 
阅读更多

http://stackoverflow.com/questions/25178329/recyclerview-and-swiperefreshlayout

 

SwipeRefreshLayout和RecyclerView一起使用的时候,有时出现RecyclerView没有滑动到顶部,手指向下滑动时,触发了SwipeRefreshLayout的刷新事件,造成了冲突。

 1.解决办法

        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener(){  
            @Override  
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {  
                int topRowVerticalPosition =  
                        (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop();  
                swipeRefreshLayout.setEnabled(topRowVerticalPosition >= 0);  
      
            }  
      
            @Override  
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
                super.onScrollStateChanged(recyclerView, newState);  
            }  
        });  

 

 

2. 写一个类继承SwipeRefreshLayout,然后重写 canChildScrollUp

 

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();
    }
}

 3.解决方法

final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener(){  
  @Override  
  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {  
    swipeRefresh.setEnabled(layoutManager.findFirstCompletelyVisibleItemPosition() == 0);
  }  
      
  @Override  
  public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
    super.onScrollStateChanged(recyclerView, newState);  
  }  
}); 

 

分享到:
评论

相关推荐

    自定义RecyclerView下拉刷新

    总结,自定义RecyclerView下拉刷新涉及的知识点包括:SwipeRefreshLayout的使用、自定义滚动事件监听、自定义头部布局以及滚动冲突的解决。通过这些技术,开发者可以创建出具有独特交互体验的下拉刷新功能,满足各种...

    谷歌5.0官方swiperefreshlayout圆圈式下拉刷新

    5. **处理滚动冲突**:当SwipeRefreshLayout内部包含可滚动的视图(如ScrollView、RecyclerView等)时,需要正确处理滚动冲突,确保用户可以正常浏览内容。 通过以上步骤,你就可以在你的应用中实现谷歌5.0官方的...

    TestSwitRefresh结合RecyclerView下拉刷新

    在Android开发中,`TestSwitRefresh`与`RecyclerView`的结合使用是创建下拉刷新功能的常见场景。`TestSwitRefresh`通常是指一个自定义的下拉刷新库,而`RecyclerView`则是一个用于展示大量数据的视图组件。在本教程...

    SwipeRefreshLayout谷歌官方下拉刷新控件

    它会自动检测并处理这些子视图的滚动事件,确保下拉刷新操作不会与子视图的滚动冲突。 3. **颜色动画**:`SwipeRefreshLayout`提供了自定义刷新指示器颜色的机制,开发者可以通过设置`setColorSchemeResources()`...

    自定义SwipeRefreshLayout实现WebView下拉刷新

    默认情况下,`SwipeRefreshLayout`与`RecyclerView`或`ListView`等滚动视图配合良好,因为这些视图在用户下拉时会自然地响应并滚动。然而,`WebView`的滚动行为是由其内部实现的,因此需要额外的处理才能使其与`...

    Recyclerview下拉刷新

    本篇文章将详细探讨如何在RecyclerView中实现下拉刷新和自动加载功能。 一、RecyclerView基本使用 1. 添加依赖:首先在build.gradle模块文件中添加RecyclerView库依赖。 ```groovy dependencies { implementation...

    SwipeRefreshLayout Demo

    2. **在XML布局文件中添加SwipeRefreshLayout**:在需要实现下拉刷新功能的布局文件中,添加SwipeRefreshLayout作为最外层的父容器,然后将你的滚动视图(如ListView或RecyclerView)作为它的子元素: ```xml ...

    google推出的SwipeRefreshLayout下拉刷新用法

    SwipeRefreshLayout与诸如RecyclerView这样的滚动视图配合使用时,需要注意滚动冲突的问题。当SwipeRefreshLayout和内部滚动视图都尝试处理滑动手势时,可能会影响用户体验。通常,SwipeRefreshLayout会自动处理这种...

    RecyclerView添加头部与底部及google配套的下拉刷新

    本教程将详细介绍如何在RecyclerView中添加头部和底部视图,并结合Google提供的下拉刷新库,实现一个功能完备的列表界面。 首先,我们来理解RecyclerView的基本结构。RecyclerView由Adapter、LayoutManager和...

    Android SwipeRefreshLayout GMail下拉刷新

    首先,SwipeRefreshLayout主要由两部分组成:一个包含可滚动视图(如ListView、RecyclerView)的父布局和一个位于顶部的刷新指示器。当用户在可滚动视图上执行下拉手势时,刷新指示器会显示出来,模拟刷新过程。一旦...

    Android RecyclerView实现了下拉刷新和上拉加载

    综上所述,通过SwipeRefreshLayout实现下拉刷新,结合自定义的滚动监听器实现上拉加载,可以在RecyclerView中构建出高效且用户体验良好的列表组件。理解并掌握这些技术,对于Android开发者来说至关重要。

    安卓下拉上拉刷新相关-SwipeRefreshLayout(下拉刷新上拉加载更多.rar

    在Android开发中,`SwipeRefreshLayout`是Google提供的一款用于实现下拉刷新和上拉加载更多的组件,它使得用户可以通过简单的手势来更新应用内容。本文将深入解析`SwipeRefreshLayout`的工作原理,以及如何在实际...

    下拉刷新,上拉加载更多.zip

    总结来说,"下拉刷新,上拉加载更多"是提高用户体验的关键特性,通过Android的SwipeRefreshLayout和RecyclerView等组件,开发者可以轻松地在应用中实现这些功能。同时,理解其背后的原理和实现方式,有助于优化代码...

    PullRefreshRecyclerView

    综上所述,“PullRefreshRecyclerView”是一个结合了RecyclerView多种item类型展示和SwipeRefreshLayout下拉刷新功能的组件。通过适当地配置Adapter、布局管理器和SwipeRefreshLayout,我们可以为用户提供一个既功能...

    android原装下拉刷新控件--SwipeRefreshLayout

    `SwipeRefreshLayout`的设计理念是为了简化下拉刷新的实现过程,它通常包裹在一个可以滚动的视图中,如`RecyclerView`或`ListView`。当用户在可滚动视图的顶部向下拉动时,`SwipeRefreshLayout`会显示一个动画效果,...

    Google官方下拉刷新控件SwipeRefreshLayout

    在`SwipeRefreshLayoutDemo`项目中,开发者通常会创建一个`SwipeRefreshLayout`实例,然后在其内部添加一个`RecyclerView`或`ListView`,接着设置刷新监听器,并在`onRefresh()`方法中实现数据的获取和更新。...

    Google官方下拉刷新组件SwipeRefreshLayout(Google最新控件)

    - 在处理滚动冲突时,例如SwipeRefreshLayout内部的RecyclerView有自己的滚动,可能需要禁用RecyclerView的滑动手势或调整布局管理器以避免冲突。 综上所述,Google的SwipeRefreshLayout控件为Android开发者提供了...

    下拉上拉刷新

    总的来说,下拉上拉刷新是移动应用开发中的重要功能,它涉及到ListView、SwipeRefreshLayout、RecyclerView和NestedScrollView等组件的使用。理解并熟练掌握这些知识点,能够帮助开发者构建更加流畅、互动性强的应用...

    Android官方下拉刷新组件——swipeRefreshLayout

    - 为了避免冲突,不要将`SwipeRefreshLayout`嵌套在其他可滚动的布局中。 以上就是关于`SwipeRefreshLayout`的基本介绍和使用方法。在实际开发中,根据项目的具体需求,你可能需要进行更多的自定义和优化,以提供...

Global site tag (gtag.js) - Google Analytics