Material Design 实战 之第五弹 —— 下拉刷新(SwipeRefreshLayout) …

Material Design 实战 之第五弹 —— 下拉刷新(SwipeRefreshLayout) …


本模块共有六篇文章,参考郭神的《第一行代码》,对Material Design的学习做一个详细的笔记,大家可以一起交流一下:


引子:

img_73d644c48ad6b29332c981fdf68ad03c.png

文章提要与总结


SwipeRefreshLayout

    1.SwipeRefreshLayout即是实现下拉刷新功能的核心类,它由support-v4库提供的;

    2.把想要实现下拉刷新功能的控件放置到SwipeRefreshLayout里边,即可迅速让这个控件支持下拉刷新了;

    3.接下来在对应的java代码中处理具体的刷新逻辑:
        3.1 实例化SwipeRefreshLayout;
        3.2 调用setcolorSchemeResources()方法来设置下拉刷新进度条的颜色;
        3.3 调用setonRefreshListener()方法设置一个下拉刷新的监听器, 
            传入一个SwipeRefreshLayout.OnRefreshListener()并重写onRefresh()来处理具体的刷新逻辑;
        3.4 刷新逻辑使用中可以使用如下多线程结构:
         new Thread(new Runnable() {
            @Override
            public void run() {
                try{

                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }
        }).start();
    其中try中书写耗时操作,然后在 runOnUiThread() 中的 run() 中获取到数据,
    并adapter.notifyDataSetChanged()调用刷新数据;
    最后调用swipeRefreshLayout的setRefreshing()并传入false,表示刷新事件结束同时隐藏刷新进度条;

正文


SwipeRefreshLayout

  (英 [swaɪp])

SwipeRefreshLayout即是实现下拉刷新功能的核心类,它由support-v4库提供的。

把想要实现下拉刷新功能的控件放置到SwipeRefreshLayout里边,即可迅速让这个控件支持下拉刷新了。
而在这里的实战项目(MaterialTest)中,应该支持下拉刷新功能的控件是RecyclerView。

下面直接开始使用它。修改activity-main.xml:

img_dcf1cde4fe42b08f166cffd0da60dc1d.png

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

       <android.support.design.widget.AppBarLayout
           android:layout_width="match_parent"
           android:layout_height="wrap_content">
           <android.support.v7.widget.Toolbar
               android:id="@+id/toolbar"
               android:layout_width="match_parent"
               android:layout_height="?attr/actionBarSize"
               android:background="?attr/colorPrimary"
               android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
               app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
               app:layout_scrollFlags="scroll|enterAlways|snap"/>
       </android.support.design.widget.AppBarLayout>

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_refresh"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior = "@string/appbar_scrolling_view_behavior">
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </android.support.v4.widget.SwipeRefreshLayout>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="16dp"
            android:src="@drawable/ic_done"
            app:elevation="8dp"/>
    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/nav_menu"
        app:headerLayout="@layout/nav_header">

    </android.support.design.widget.NavigationView>

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

这里在RecyclerView的外面再嵌套一层SwipeRefreshLayout,让RecyclerView实现下拉刷新功能。

另注意,
由于RecyclerView现在变成了Swipe-RefreshLayout的子控件,
因此之前使用app:layout_behavxor声明的布局行为现在也要移到SwipeRefreshLayout中才行。

当然,虽RecyclerView已经支持下拉刷新功能,但还要在代码中处理具体的刷新逻辑才行。
下面修改MainActivity:

img_80928b6aa3666a4dbb2fdcbefb50decc.png

img_dd6ddc614cbdf8c79e9d143b532609b3.png

img_87c1f06aee54adff6fc416f2f7946584.png

//下拉刷新
    private SwipeRefreshLayout swipeRefresh;
------------------------------------


 //下拉刷新逻辑处理
        swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);
        swipeRefresh.setColorSchemeResources(R.color.colorPrimary);
        swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.
                OnRefreshListener(){
            @Override
            public void onRefresh() {
                refreshFruits();
            }
        });
------------------------------------

 private void refreshFruits(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    Thread.sleep(2000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        initFruits();
                        adapter.notifyDataSetChanged();
                        swipeRefresh.setRefreshing(false);
                    }
                });
            }
        }).start();
    }

这里,
首先实例化SwipeRefreshLayout,
然后调用setcolorSchemeResources()方法来设置下拉刷新进度条的颜色,这里使用主题中的colorPrimary作为进度条的颜色。
接着调用setonRefreshListener()方法设置一个下拉刷新的监听器,当触发了下拉刷新操作的时候就会回调这个监听器的onRefresh()方法,在这个方法中处理具体的刷新逻辑。(这里可以类比setOnClickListener理解)

通常onRefresh()方法中应该是去网络上请求最新的数据,然后再将这些数据展示出来。
这里就不和网络交互了,简单地写一个refreshFruits()方法并调用它进行本地刷新操作。

refreshFruits()方法中先是开启了一个线程,然后将线程沉睡两秒钟,模拟刷新的等待过程。
因为本地刷新操作速度非常快,如果不将线程沉睡的话,刷新会即刻结束而看不到刷新的过程。
沉睡结束后使用run0nUiThread()方法将线程切换回主线程,
调用initFruits()方法重新生成数据,
接着调用FruitAdapter的notifyDataSetChanged()通知数据发生了变化并刷新adapter里面的数据,
最后调用swipeRefreshLayout的setRefreshing()并传入false,表示刷新事件结束同时隐藏刷新进度条。

重新运行一下程序,在屏幕的主界面向下拖动,会出现下拉刷新的进度条,松手后就会自动进行刷新了,效果如图:

img_599b3d75c347ad22482de6f1cbac36bd.png

刷新中

img_5872814e686e434a1c2ea2ef21da4f08.png

刷新后

下拉刷新进度条会停留两秒钟,随后自动消失,水果列表也会更新了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101392.html原文链接:https://javaforall.net

(0)
上一篇 2021年6月14日 上午8:00
下一篇 2021年6月14日 上午9:00


相关推荐

  • Dedecms去掉URL中a目录的方法

    Dedecms去掉URL中a目录的方法

    2021年10月7日
    43
  • 爬虫课第一次报错总结

    爬虫课第一次报错总结1importurllib.requesturl=’https://www.baidu.com/s?wd=海贼王’res=urllib.request.urlopen(url)UnicodeEncodeError:‘ascii’codeccan’tencodecharactersinposition10-12:ordinalnotinrange(128)原因:url包含不是ascii的字符处理:把“海贼王”改为%+十六进制(法1:百度,法2urllib.par

    2022年7月11日
    19
  • 内容串讲

    内容串讲渡课 Java103 班内容串讲 HTML 什么是 HTML 理解 HTML 本质是超文本标记语言 能表现如文字 视频 音频 程序等复杂元素 什么是标签理解什么是标签 标签对的组成 标签名 属性 名值对 内容属性类似是给这个标签的内容加了个装备 让这些标签具有一些特殊的能力例如 amp amp amp amp amp lt ahref amp amp amp amp quot www baidu com amp

    2026年3月18日
    2
  • 讯飞星火怎么一键生成直播话术_讯飞星火话术生成与节奏把控【教程】

    讯飞星火怎么一键生成直播话术_讯飞星火话术生成与节奏把控【教程】

    2026年3月14日
    2
  • UDP flood攻击_udp攻击是什么意思

    UDP flood攻击_udp攻击是什么意思UDPFlood是日渐猖厥的流量型DoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100kpps的UDPFlood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDPFLOOD攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。…

    2026年4月14日
    4
  • 关于layuiAdmin 后台管理模板购买授权的问题

    关于layuiAdmin 后台管理模板购买授权的问题购买授权之前 建议认真阅读下述 解惑 以免造成不必要的困惑 另外也可以阅读 layui 付费产品服务条款 注意 layuiAdmin 受国家计算机软件著作权保护 登记号 2018SR 不得恶意分享产品源代码 二次转售等 违者必究 应该如何选择版本 通常我们推荐您选择 套餐版 它同时包含了 单页版 和 iframe 版 你随时可根据项目需求和团队情况 自由切换 但如果你

    2025年9月5日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号