• 依赖
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
常用方法
  • setOnRefreshListener:设置刷新监听器。需要重写监听器OnRefreshListener的onRefresh方法,该方法在下拉松开时触发。
  • setRefreshing:设置刷新的状态。true表示正在刷新,false表示结束刷新。
  • isRefreshing:判断是否正在刷新。
  • setColorSchemeColors:设置进度圆圈的圆环颜色。
  • setProgressBackgroundColorSchemeColor:设置进度圆圈的背景颜色。
  • setProgressViewOffset:设置进度圆圈的偏移量。第一个参数表示进度圈是否缩放,第二个参数表示进度圈开始出现时距顶端的偏移,第三个参数表示进度圈拉到最大时距顶端的偏移。
  • setDistanceToTriggerSync:设置手势向下滑动多少距离才会触发刷新操作。

一、 基本使用

  • 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
      android:id="@+id/swipeRefreshLayout"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
    <TextView
        android:id="@+id/swipe_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="要刷新的布局"
        />
  </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

  </LinearLayout>
  • MainActivity
public class MainActivity extends AppCompatActivity {

    private SwipeRefreshLayout swipeRefreshLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        swipeRefreshLayout=findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.teal_200));//设置刷新转圈的颜色
        swipeRefreshLayout.setProgressBackgroundColorSchemeColor(getResources().getColor(R.color.purple_200));//设置刷新的背景颜色
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh(){//刷新的处理事件
                //假设两秒后停止刷新
                //开启子线程
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                            swipeRefreshLayout.setRefreshing(false);//停止刷新
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
    }
 }
  • 结束

二、 加上枚举耗时使用

  • 布局和上面都一样
  • 不同的是对 刷新侦听器的处理
  • 定义用到的参数
public static final int STATE_LOADING = 0;//加载中
    public static final int STATE_ERROR = 1;//错误
    public static final int STATE_SUCCESS = 2;//成功
    public static final int STATE_EMPTY = 3;//空
    public int mCurState = STATE_LOADING;//默认是加载中的情况
    private LoadDataTask mLoadDataTask;//定义一个初始化的加载状态为null
//刷新侦听器的处理  
   swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //触发加载数据
                triggerLoadData();
            }
        });
    private void triggerLoadData() {
        if (mCurState!=STATE_SUCCESS){
            if (mLoadDataTask==null){
                //异步加载
                mLoadDataTask = new LoadDataTask();
                ThreadPoolProxyFactory.getNormalThreadPoolProxy().submit(mLoadDataTask);//线程池
            }
        }
    }

 //定义个耗时线程
    private class LoadDataTask implements Runnable{
        @Override
        public void run() {
            //真正的在子线程中加载具体的数据-->得到数据(为了得到的状态值只有3个,创一个枚举)
            LoadedResult loadedResult=initData();
            mCurState=loadedResult.getState();
            //UI刷新
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    initOnUi();
                }
            });
            //置空任务
            mLoadDataTask = null;
        }
    }

private LoadedResult initData() {  //做耗时的操作
        //处理耗时的数据请求 两秒后停止
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //获取http请求 或者 其他耗时请求 得到结果result
        //如果结果为空 return LoadedResult.EMPTY;
        //如果结果请求失败 return LoadedResult.ERROR;
        //如果结果成功 return LoadedResult.SUCCESS;
        return LoadedResult.SUCCESS;
    }

  //标识数据加载结果的枚举类
    public enum LoadedResult {
        /**
         * STATE_ERROR = 1;//错误
         * STATE_SUCCESS = 2;//成功
         * STATE_EMPTY = 3;//空
         */
        SUCCESS(STATE_SUCCESS), ERROR(STATE_ERROR), EMPTY(STATE_EMPTY);

        private int state;

        LoadedResult(int state) {
            this.state = state;
        }

        public int getState() {
            return state;
        }
    }
//主线程的处理,刷新UI
 private void initOnUi() {
        if (mCurState==STATE_LOADING){
            swipeText.setText("加载中");
            swipe.setRefreshing(true);//加载中
        }
        if (mCurState==STATE_ERROR){
            swipeText.setText("加载失败");
            swipe.setRefreshing(false);//加载失败
        }
        if (mCurState==STATE_SUCCESS){
            swipeText.setText("加载成功");
            mCurState = STATE_LOADING;//回复初始状态
            swipe.setRefreshing(false);//加载成功
        }
    }
  • ThreadPoolProxyFactory 工厂类,封装对ThreadPoolProxy创建
/**
 * 工厂类,封装对ThreadPoolProxy创建
 */
public class ThreadPoolProxyFactory {
    //普通类型的线程池代理
    static ThreadPoolProxy mNormalThreadPoolProxy;

    //下载类型的线程池代理
    static ThreadPoolProxy mDownLoadThreadPoolProxy;

    /**
     * 得到普通类型的线程池代理
     */
    public static ThreadPoolProxy getNormalThreadPoolProxy(){
        if (mNormalThreadPoolProxy==null){
            synchronized (ThreadPoolProxyFactory.class){
                if (mNormalThreadPoolProxy==null){
                    mNormalThreadPoolProxy=new ThreadPoolProxy(5,5);
                }
            }
        }
        return mNormalThreadPoolProxy;
    }
    /**
     * 得到下载类型的线程池代理
     */
    public static ThreadPoolProxy getDownLoadThreadPoolProxy(){
        if (mDownLoadThreadPoolProxy==null){
            synchronized (ThreadPoolProxyFactory.class){
                if (mDownLoadThreadPoolProxy==null){
                    mDownLoadThreadPoolProxy=new ThreadPoolProxy(3,3);
                }
            }
        }
        return mDownLoadThreadPoolProxy;
    }
}
  • ThreadPoolProxy

线程池代理类,替线程池完成相关操作
1.代理模式就是多一个代理类出来,替原对象进行一些操作
2.只需提供使用原对象时候真正关心的方法(提交任务,执行任务,移除任务)
3.可以对原对象方法进行增强

public class ThreadPoolProxy {
    ThreadPoolExecutor mExecutor;
    private int mCorePoolSize;//核心池的大小
    private int mMaximumPoolSize;//线程最大线程数

    public ThreadPoolProxy(int mCorePoolSize, int mMaximumPoolSize) {
        this.mCorePoolSize = mCorePoolSize;
        this.mMaximumPoolSize = mMaximumPoolSize;
    }

    //创建线程池
    private void initThreadPoolExecutor() {
        //双重检查加锁 : 只有第一次实例化的时候才启用同步机制,提高了性能
        if (mExecutor == null || mExecutor.isShutdown() || mExecutor.isTerminated()){
            synchronized (ThreadPoolProxy.class){
                if (mExecutor == null || mExecutor.isShutdown() || mExecutor.isTerminated()){
                    long keepAliveTime = 0;
                    TimeUnit unit = TimeUnit.MILLISECONDS;
                    BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue();
                    ThreadFactory threadFactory = Executors.defaultThreadFactory();
                    RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
                    mExecutor=new ThreadPoolExecutor(mCorePoolSize,mMaximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler);
                }
            }
        }
    }
    /**
     * 提交任务
     */
    public Future submit(Runnable task){
        initThreadPoolExecutor();
        Future<?> future=mExecutor.submit(task);
        return future;
    }
    /**
     * 执行任务
     */
    public void execute(Runnable task){
        initThreadPoolExecutor();
        mExecutor.execute(task);
    }
    /**
     * 移除任务
     */
    public void remove(Runnable task){
        initThreadPoolExecutor();
        mExecutor.remove(task);
    }
}
  • 结束