SwipeRefreshLayout组件是由Android SDK提供,已经被用于一些Android自己的应用程序(比如Gmail)的实现,并且SwipeRefreshLayout组件只接受一个子组件:即需要刷新的那个组件。它使用一个侦听机制来通知拥有该组件的监听器有刷新事件发生,换句话说我们的Activity必须实现通知的接口。该Activity负责处理事件刷新和刷新相应的视图。一旦监听者接收到该事件,就决定了刷新过程中应处理的地方。如果要展示一个“刷新动画”,它必须调用setRefrshing(true)
,否则取消动画就调用setRefreshing(false)。
下面我结合listView做一个简单的例子供大家参考学习
SwipeRefreshLayout配置起来非常简单,由于是SDK所提供,所以不需要添加依赖进项目,直接在xml文件中使用即可
布局文件如下(注意,SwipeRefreshLayout只接受一个子控件)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zhuandian.msuic.pull_to_refresh.SwipeRefreshLayout">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
一定要注意不要把SwipeRefreshLayout的包名写错。
java代码如下:
package com.zhuandian.msuic.pull_to_refresh;
/**
* Created by 谢栋 on 2016/12/25.
*/
public class SwipeRefreshLayout extends AppCompatActivity {
private ListView listView;
private android.support.v4.widget.SwipeRefreshLayout swipeRefresh;
private ArrayAdapter<String> mAdapter;
private List<String> mDatas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_swipe_refresh_layout);
listView = (ListView) findViewById(R.id.listview);
swipeRefresh = (android.support.v4.widget.SwipeRefreshLayout) findViewById(R.id.swipe_refresh);
mDatas = new ArrayList<>();
loadDatas();
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas);
listView.setAdapter(mAdapter);
//设置圆环动画的颜色 最多可设置4中颜色
swipeRefresh.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
//设置下拉刷新监听
swipeRefresh.setOnRefreshListener(new android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// mDatas.add("刷新进来的数据"+(count++));
new MyAsyncTask().execute();
}
});
}
private int count = 1; //数据角标
//模拟装载数据
private void loadDatas() {
for (int i = 0; i < 10; i++) {
mDatas.add(String.format(Locale.CHINA, "被装载进%3d条数据", count));
count++;
}
}
/**
* 异步任务类,下拉或者上拉时模拟请求数据
*/
class MyAsyncTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
loadDatas();
return "success";
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if ("success".equals(s)) {
mAdapter.notifyDataSetChanged();
swipeRefresh.setRefreshing(false); //停止刷新动画
}
}
}
}
在java代码中需要设置SwipeRefreshLayout下拉刷新的监听状态,或者根据需要配置头部动画的颜色,这里需要提下有些开发者可能迷惑在有些地方看到的SwipeRefreshLayout下拉刷新动画是类似一个进度条的加载动画,有些地方是一个圆形的,这是API版本所致,旧版本是进度条样式,新版本是圆环,大家知道即可,不必过于纠结
新旧版本动画对比如下: