android 原生下拉刷新控件SwipeRefreshLayout的使用

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

}

猜你喜欢

转载自blog.csdn.net/qq_36699930/article/details/80282191