SwipeRefreshLayout是一种下拉刷新的组件,它被放到了V4包中,只允许有一个直接子类。
使用SwipeRefreshLayout可以实现下拉刷新,前提是布局里需要包裹一个可以滑动的子控件,然后在代码里设置OnRefreshListener设置监听,最后在监听里设置刷新时的数据获取就可以了。
主要方法:
1.isRefreshing()
判断当前的状态是否是刷新状态。
2.setColorSchemeResources(int... colorResIds)
设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不同的颜色,每转一圈就显示一种颜色。
3.setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener)
设置监听,需要重写onRefresh()方法,顶部下拉时会调用这个方法,在里面实现请求数据的逻辑,设置下拉进度条消失等等。
4.setProgressBackgroundColorSchemeResource(int colorRes)
设置下拉进度条的背景颜色,默认白色。
5.setRefreshing(boolean refreshing)
设置刷新状态,true表示正在刷新,false表示取消刷新。
由于SwipeRefreshLayout没有底部加载更多,需要自己添加
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
style="?android:progressBarStyleLarge"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_centerVertical="true"
android:layout_marginLeft="18dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="加载更多..."
android:textSize="16sp" />
</RelativeLayout>
使用:
<?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_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xiaoyehai.swiperefreshlayout.Main2Activity">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</android.support.v4.widget.SwipeRefreshLayout>
package com.xiaoyehai.swiperefreshlayout;
import android.graphics.Color;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.xiaoyehai.swiperefreshlayout.adapter.MyAdapter;
import com.xiaoyehai.swiperefreshlayout.base.BaseActivity;
import com.xiaoyehai.swiperefreshlayout.bean.GameInfo;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class Main2Activity extends BaseActivity {
private ListView mListView;
int page = 0;
private SwipeRefreshLayout mSwipeRefreshLayout;
private List<GameInfo.ListBean> mDataList = new ArrayList<>();
private MyAdapter mAdapter;
//底部
private View mFooterView;
@Override
protected int getLayoutID() {
return R.layout.activity_main2;
}
@Override
protected void initView() {
findViews();
//设置下拉刷新控件的颜色
mSwipeRefreshLayout.setColorSchemeColors(Color.GREEN);
}
@Override
protected void initListener() {
//下拉刷新
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//下拉刷新返回第一页数据
page = 0;
getDataFromNet();
}
});
//上拉加载更多
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE) {
if (view.getLastVisiblePosition() == mDataList.size()) { //list.size() - 1:没加底部
View childView = mListView.getChildAt(mListView.getChildCount() - 1);
if (childView.getBottom() == mListView.getBottom()) {
page++;
getDataFromNet();
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
}
@Override
public void initData() {
super.initData();
//加载ListView的底部布局
mFooterView = getLayoutInflater().inflate(R.layout.footer_view, mListView, false);
mListView.addFooterView(mFooterView);
mAdapter = new MyAdapter(Main2Activity.this, mDataList, R.layout.item);
mListView.setAdapter(mAdapter);
getDataFromNet();
}
private void getDataFromNet() {
String url = "http://qt.qq.com/php_cgi/news/php/varcache_getnews.php?id=12&page=" + page + "&plat=android&version=9724";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
mSwipeRefreshLayout.setRefreshing(false); //加载完成后将下拉刷新控件隐藏
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//在子线程
final String result = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
GameInfo gameInfo = new Gson().fromJson(result, GameInfo.class);
List<GameInfo.ListBean> tempList = gameInfo.getList();
//下拉刷新时显示第一页数据,要清空以前加载的数据
if (page == 0) {
mDataList.clear();
}
// 当当前页的数据返回小于10时,就代表已经是最后一页
if (tempList.size() < 10) {
Toast.makeText(Main2Activity.this, "数据加载完毕!", Toast.LENGTH_SHORT).show();
mListView.removeFooterView(mFooterView);
}
if (tempList != null) {
mDataList.addAll(tempList);
mAdapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false); //加载完成后将下拉刷新控件隐藏
}
}
});
}
});
}
private void findViews() {
mListView = (ListView) findViewById(R.id.listview);
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
}
}