SwipeRefreshlayout基本使用及总结

1、SwipeRefreshlayout介绍:
Google提供的官方的下拉刷新的控件,它只接受一个子组件:即需要刷新的那个组件(可以滑动比如:ScrollView、ListView、WebView、RecyclerView等)

2、SwipeRefreshlayout基本使用:
使用巨简单、以嵌套WebView为例子:
布局代码:

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

  <android.support.v4.widget.SwipeRefreshLayout
      android:id="@+id/swipelayout"
      android:layout_width="match_parent"
      android:layout_height="match_parent" >

    <WebView
        android:id="@+id/web"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
   </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

Activity中代码:

mSwipe = (SwipeRefreshLayout) findViewById(R.id.swipelayout);
    /*
     * 设置进度条的颜色
     * 参数是一个可变参数、可以填多个颜色
     */
    mSwipe.setColorSchemeColors(Color.parseColor("#d7a101"),Color.parseColor("#54c745"),Color.parseColor("#f16161"),Color.BLUE,Color.YELLOW);
    /*
     * 设置下拉刷新的监听
     */
    mSwipe.setOnRefreshListener(new OnRefreshListener() {
        @Override
        public void onRefresh() {
            wvTest.loadUrl("http://www.baidu.com");
            mSwipe.postDelayed(new Runnable() {
                @Override
                public void run() {
                    /*
                     * 加载完毕之后就关闭进度条
                     */
                    mSwipe.setRefreshing(false);
                }
            }, 10000);
        }
    });

3、滑动冲突问题:
SwipeRefreshlayout在嵌套ListView、WebView同时,ListView、WebView外层还嵌套了一层ViewGroup就会出现滑动冲突的问题。在SwipeRefreshlayout和ViewPager结合使用的时候也会出现滑动冲突的问题。下面是解决方案:
3.1 SwipeRefreshlayout嵌套ListView滑动冲突
方案1、实现ListView的onScrollListener,判断firstVisibleItem == 0&&firstItem.getTop()即:ListView中可见的第一个item是否是第一个,且第一个距离顶部的距离为0,来设置SwipeLayout的

mSwipe.setEnabled(enable);//true:可以下拉;false:不可下拉

方案2:继承SwipeRefreshlayout,重写它的canChildScrollUp()方法
原理:http://blog.csdn.net/zhongyifly/article/details/51519116

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

  /**
   * ListView被嵌套
   */
  @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.2 SwipeRefreshlayout嵌套ViewPager滑动冲突
方案1:在ViewPager中解决,即:监听在viewpager上滑动的距离,如果 横向滑动距离>纵向滑动距离 设置setEnabled(false)禁止SwipeRefreshlayout下拉,否则setEnable(true),允许下拉刷新。

/**记录ViewPager滑动的位置*/
private int mLastX;
private int mLastY;

vpBanner.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            int action = event.getAction();
            switch (action) {
            case MotionEvent.ACTION_MOVE:
                int a = x - mLastX;
                int b = y - mLastY;
                if(Math.abs(a) > Math.abs(b)){
                    swipelayout.setEnabled(false);
                }else{
                    swipelayout.setEnabled(true);
                }
                break;
            }
          
            mLastX = x;
            mLastY = y;
            return false;
        }
    });

方案2:在自定义Layout extends SwipeRefreshlayout,重写它的onInterceptTouchEvent方法。

private int mLastX;
private int mLastY;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    int x = (int) ev.getX();
    int y = (int) ev.getY();
    int action = ev.getAction();
    switch (action) {
        case MotionEvent.ACTION_MOVE:
            int a = x - mLastX;
            int b = y - mLastY;
            if(Math.abs(a) > Math.abs(b)){
                setEnabled(false);
            }else{
                setEnabled(true);
            }
            break;
        case MotionEvent.ACTION_UP:
            setEnabled(true);
            break;
    }
    mLastX = x;
    mLastY = y;
    return super.onInterceptTouchEvent(ev);
}

4、自动刷新功能
即:进入页面,SwipeRefreshlayout的进度条弹出来,进行刷新功能;
参考:http://www.2cto.com/kf/201508/434568.html

/**
 * 自动刷新
 */
public void autoRefresh() {
    try {
        Field mCircleView = SwipeRefreshLayout.class.getDeclaredField("mCircleView");
        mCircleView.setAccessible(true);
        View progress = (View) mCircleView.get(this);
        progress.setVisibility(VISIBLE);
        Method setRefreshing = SwipeRefreshLayout.class.getDeclaredMethod("setRefreshing", boolean.class, boolean.class);
        setRefreshing.setAccessible(true);
        setRefreshing.invoke(this, true, true);
    } catch (Exception e) {
    }
}
    原文作者:OnMiss
    原文地址: https://www.jianshu.com/p/3c402a9e4b7d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞