Android下拉刷新的实现(一) - SwipeRefreshLayout篇
👉关于作者
已经工作三年的95后程序员,坐标上海。平时在公司写Android原生App,业务时间会抽空学习Java后端,目标是成为全栈工程师,志同道合的可以私我聊聊haha。加入CSDN快4年了,看了很多优秀作者的博客收获很多。后面的时间里,我写也会整理总结一些工作中使用到的知识分享出来。我的座右铭:人生在勤,不索何获。大家一起努力加油吧
👉正文部分
Android下拉刷新的实现系列文章准备了两篇,对应SwipeRefreshLayou和PtrFrameLayout。SwipeRefreshLayout作为Android原生的下拉刷新控件,UI效果比较简洁,也比较容易开发,但是实现的效果过于简单,对于提升页面的美观度有着局限性;PtrFrameLayout是一款下拉刷新框架,提供的UI效果比较好,复杂度也会高一点,大家可以按照自己的实际情况来进行选择
1、使用场景
当界面中的数据需要刷新时,通过下拉界面从而触发刷新,刷新开始的同时会去请求数据,等到数据请求结束关掉Loading
2、实现效果
3、gradle引用
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
4、具体使用
4.1、xml布局,将需要更新的内容布局嵌套到SwipeRefreshLayout中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".swipe_refresh_layout.SwipeRefreshLayoutDemoActivity">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/swipe_refresh_layout_demo_activity"
android:gravity="center" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</RelativeLayout>
4.2、代码设置
1、findViewById
SwipeRefreshLayout swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout);
2、Loading的样式设置
//设置进度条的颜色
swipeRefreshLayout.setColorSchemeResources(R.color.green);
//设置进度条的背景颜色
swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.d3_bg_gray);
设置后的效果
3、代码中设置监听器,监听到刷新事件后开始请求数据,请求结束后关闭Loading
//设置刷新监听器
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//开始网络请求
String url = "...";
final Request request = new Request.Builder().url(url).build();
//开启子线程进行网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
final Response response = okHttpClient.newCall(request).execute();
//请求结束后,切换到主线程处理UI
mainHandler.post(new Runnable() {
@Override
public void run() {
//关闭刷新
swipeRefreshLayout.setRefreshing(false);
try {
Toast.makeText(SwipeRefreshLayoutDemoActivity.this,response.body().string(),Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});