为了账号安全,请及时绑定邮箱和手机立即绑定

Android零基础入门第72节:SwipeRefreshLayout下拉刷新

标签:
Android

在实际开发中,经常都会遇到下拉刷新、上拉加载更多的情形,这一期就一起来学习Android系统的SwipeRefreshLayout下拉刷新组件。

                                    

一、SwipeRefreshLayout简介

    SwipeRefrshLayout是Google官方更新的一个控件,可以实现下拉刷新的效果,该控件集成自ViewGroup在support-v4兼容包下。

    SwipeRefrshLayout常用的几个方法如下:

·         isRefreshing():判断当前的状态是否是刷新状态。

·         setColorSchemeResources(int... colorResIds):设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不同的颜色,每转一圈就显示一种颜色。

·         setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener):设置监听,需要重写onRefresh()方法,顶部下拉时会调用这个方法,在里面实现请求数据的逻辑,设置下拉进度条消失等等。

·         setProgressBackgroundColorSchemeResource(int colorRes):设置下拉进度条的背景颜色,默认白色。

·         setRefreshing(boolean refreshing):设置刷新状态,true表示正在刷新,false表示取消刷新。

    使用SwipeRefrshLayout要想达到刷新的目的,首先需要在这个布局里包裹可以滑动的子控件,如ScrollView、ListView、RecyclerView等,并且只能有一个子控件。然后在代码里设置OnRefreshListener设置监听,最后在监听里设置刷新时的数据获取就可以了。

二、简单示例

    上面分析了SwipeRefreshLayout和其主要方法,其实使用起来非常的简单,接下来先通过一个简单示例来学习SwipeRefreshLayout的使用方法。

    继续使用WidgetSample工程的advancedviewsample模块,在src/main/res/layout/目录下创建swiperefreshlayout_layout.xml文件,在其中填充如下代码片段:

[代码]xml代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

<?xml version="1.0" encoding="utf-8"?>

<android.support.v4.widget.SwipeRefreshLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/container_swipe"

    android:layout_width="match_parent"

    android:layout_height="wrap_content">

 

    <ScrollView

        android:layout_width="match_parent"

        android:layout_height="wrap_content">

        <TextView

            android:id="@+id/content_tv"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:gravity="center"

            android:paddingTop="10dp"

            android:text="SwipeRefreshLayout下拉刷新控件"

            android:textSize="20sp"

            android:textStyle="bold"/>

    </ScrollView>

 

</android.support.v4.widget.SwipeRefreshLayout>

   上面的代码中SwipeRefreshLayout只有一个为ScrollView的子元素,其中是一个文本框,通过下拉刷新来更新文本框里面的内容。

    然后新建SwipeRefreshLayoutActivity.java文件,加载上面的布局文件,填充的代码如下:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

package com.jinyu.cqkxzsxy.android.advancedviewsample;

 

import android.os.Bundle;

import android.os.Handler;

import android.support.v4.widget.SwipeRefreshLayout;

import android.support.v7.app.AppCompatActivity;

import android.widget.TextView;

 

/**

 * @创建者 鑫鱻

 * @描述 Android零基础入门到精通系列教程,欢迎关注微信公众号ShareExpert

 */

public class SwipeRefreshLayoutActivity   extends AppCompatActivity

        implements SwipeRefreshLayout.OnRefreshListener {

    private SwipeRefreshLayout mSwipeRefreshLayout = null;

    private TextView mContentTv = null;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.swiperefreshlayout_layout);

 

        mSwipeRefreshLayout   = (SwipeRefreshLayout) findViewById(R.id.container_swipe);

        mContentTv   = (TextView) findViewById(R.id.content_tv);

 

        //   设置刷新时动画的颜色,可以设置4个

        mSwipeRefreshLayout.setColorSchemeResources(

                android.R.color.holo_blue_light,

                android.R.color.holo_red_light,

                android.R.color.holo_orange_light,

                android.R.color.holo_green_light);

        //   设置下拉监听事件

        mSwipeRefreshLayout.setOnRefreshListener(this);

    }

 

    @Override

    public void onRefresh() {

        mContentTv.setText("正在刷新,请稍后。。。");

 

        //   模拟耗时更新操作

        new Handler().postDelayed(new Runnable() {

            @Override

            public void run() {

                mContentTv.setText("刷新完毕!");

                mSwipeRefreshLayout.setRefreshing(false);

            }

        },   5000);

    }

}

    上面的代码很简单,先给SwipeRefreshLayout设置了刷新时的动画颜色,然后给SwipeRefreshLayout添加一个下拉的Listener,在onRefresh()回调方法中来改变文本框里面的内容。这里使用到了一个Handler对象模拟耗时操作,操作完毕后再更新文本框里面的内容。关于Handler的使用方法后续会详细学习,这里先暂时借用一下。

    修改启动的Activity,运行程序,下拉页面可以看到所示效果。

三、综合示例

    上面的示例将SwipeRefreshLayout和ScrollView结合起来使用,一般开发里面结合ListView和RecyclerView较多,接下来再分享一个简单结合RecyclerView的案例。

    在RecyclerView数据动态更新案例的基础上来修改,首先修改布局文件,在RecyclerView的外层LinearLayout替换为SwipeRefreshLayout,修改后的recyclerview_layout.xml文件代码如下:

[代码]xml代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

<?xml version="1.0" encoding="utf-8"?>

<android.support.v4.widget.SwipeRefreshLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/swiperefreshlayout"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

 

    <android.support.v7.widget.RecyclerView

        android:id="@+id/recyclerview"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" />

</android.support.v4.widget.SwipeRefreshLayout>

    关于RecyclerView的item布局和适配器代码不变,为了不影响原来的代码,这里新建一个SwipeRecyclerViewActivity文件,代码如下:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

package com.jinyu.cqkxzsxy.android.advancedviewsample;

 

import android.os.Bundle;

import android.os.Handler;

import android.support.v4.widget.SwipeRefreshLayout;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.DefaultItemAnimator;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

 

import com.jinyu.cqkxzsxy.android.advancedviewsample.adapter.RecyclerViewAdapter2;

import com.jinyu.cqkxzsxy.android.advancedviewsample.view.RecyclerViewItemDivider;

 

import java.util.ArrayList;

 

/**

 * @创建者 鑫鱻

 * @描述 Android零基础入门到精通系列教程,欢迎关注微信公众号ShareExpert

 */

public class SwipeRecyclerViewActivity   extends AppCompatActivity

        implements SwipeRefreshLayout.OnRefreshListener {

    private SwipeRefreshLayout mSwipeView = null;

    private RecyclerView mRecyclerView = null;

    private RecyclerViewAdapter2 mAdapter = null;

    private ArrayList<string> mDatas = null;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.swip_recycler_view_layout);

 

        //   获取界面组件

        mSwipeView   = (SwipeRefreshLayout) findViewById(R.id.swiperefreshlayout);

        mRecyclerView   = (RecyclerView) findViewById(R.id.recyclerview);

 

        //   设置管理器

        LinearLayoutManager   layoutManager = new LinearLayoutManager(this);

        mRecyclerView.setLayoutManager(layoutManager);

        //   自定义分割线

        RecyclerView.ItemDecoration   itemDecoration = new RecyclerViewItemDivider(this,

                R.drawable.recyclerview_item_divider);

        mRecyclerView.addItemDecoration(itemDecoration);

        //   如果可以确定每个item的高度是固定的,设置这个选项可以提高性能

        mRecyclerView.setHasFixedSize(true);

 

        //   初始化列表数据

        initDatas();

        //   设置适配器

        mAdapter   = new RecyclerViewAdapter2(this,   mDatas);

        mRecyclerView.setAdapter(mAdapter);

        //   设置默认动画

        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

 

        //   设置颜色属性的时候一定要注意是引用了资源文件还是直接设置16进制的颜色,都是int值容易搞混

        //   设置下拉进度的背景颜色,默认就是白色的

        mSwipeView.setProgressBackgroundColorSchemeResource(android.R.color.white);

        //   设置下拉进度的主题颜色

        mSwipeView.setColorSchemeResources(

                R.color.colorPrimaryDark,

                R.color.colorAccent,

                R.color.colorPrimary);

        //   下拉时触发SwipeRefreshLayout的下拉动画,动画完毕之后就会回调这个方法

        mSwipeView.setOnRefreshListener(this);

    }

 

    private void initDatas() {

        mDatas   = new ArrayList<>();

 

        for (int i = 0; i < 50; i++) {

            mDatas.add(i,   i + 1 + "");

        }

    }

 

    @Override

    public void onRefresh() {

        //   模拟一些比较耗时的操作,比如联网获取数据,需要放到子线程去执行

        new Handler().postDelayed(new Runnable() {

            @Override

            public void run() {

                mAdapter.addData(0);

                mAdapter.notifyDataSetChanged();

 

                mSwipeView.setRefreshing(false);

            }

        },   2000);

    }

}

</string>

 

    上述代码首先获取布局控件,先设置RecyclerView显示的管理器和适配器,然后再设置SwipeRefreshLayout。

    修改程序启动的Activity,运行程序,下拉列表页面,可以看到所示效果 

    这里只是简单示范了一下SwipeRefreshLayout和RecyclerView结合使用的案例,还可以在这基础上增加下拉刷新的列表头提示灯操作。

    至此,Android中常用的一些UI控件暂告一段落,关于菜单、对话框等内容后续再学习。下一期差不多是国庆长假之后开始学习Android四大组件之手——Activity,敬请期待。

 最后了,分享一点儿好消息给大家!

    截至目前,Android零基础入门系列教程差不多已经连载分享了72篇,如果对你有帮助,欢迎点赞、留言和关注,你的回馈将是我不断分享的动力。当然也鼓励分享给你身边那些有需要的朋友,我们一起成长!

    也由衷的感谢大家的一路陪伴和支持,为了表示感谢,国庆黄金周结束有惊喜送上哦!

    最后祝大家国庆、中秋双节快乐!吃的开心、喝的开心、玩的开心,快乐每一天!

今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

原文链接:http://www.apkbus.com/blog-205190-74129.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消