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

猜你喜欢

转载自tongxiaoming520.iteye.com/blog/2322576
今日推荐