SwipeRefreshLayout 和RecyclerView下拉冲突

本文介绍了当SwipeRefreshLayout与RecyclerView结合使用时可能出现的滑动冲突问题,并提供了三种解决方案:通过设置OnScrollListener来动态禁用刷新功能;创建SwipeRefreshLayout的子类并重写canChildScrollUp方法;监听RecyclerView滚动状态改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值