Android智能下拉刷新框架—SmartRefreshLayout的使用

2023-11-19

转载请注明出处:http://blog.csdn.net/jarchie520/article/details/78193387

上个月因为自己太懒了,加上又发生了一点小事,就没能及时更新博客,下了班回家面壁思过去吧。

今天这篇文章主要是介绍一下SmartRefreshLayout这个第三方下拉刷新库的使用,之前在项目中一直用的都是PullToRefreshLayout这个库,感觉有不少坑,后面谷歌又出了SwipeRefreshLayout,毕竟谷歌自家的,还是得多多支持。最近想积累自己的技术栈,想着集成一些高效稳定的第三方框架并且基于一些开放的api快速开发一款应用,于是就到处去找这个项目的各个配件。在下拉刷新这方面,最终选择了这个SmartRefreshLayout这个库,github上面的star数也是相当的多啊,可见它还是很受欢迎的。我这里是简单的写了个Demo,测试了一下它的用法,确实是挺优秀的框架。

一、使用过程

1、首先给项目添加依赖,在build.gradle文件的dependencies闭包中添加这句话:compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.3'

2、Activity的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar style="@style/AppTheme.Toolbar"
        android:id="@+id/toolbar"
        app:navigationIcon="?attr/homeAsUpIndicator"
        app:title="测试"/>

    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srlEnableLoadmore="true">
        <com.scwang.smartrefresh.layout.header.ClassicsHeader
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:srlFinishDuration="500"
            app:srlEnableLastTime="true"
            app:srlClassicsSpinnerStyle="FixedBehind"
            app:srlTextSizeTitle="16sp"
            app:srlTextSizeTime="10dp"
            app:srlTextTimeMarginTop="2dp"
            app:srlDrawableArrowSize="20dp"
            app:srlDrawableProgressSize="20dp"
            app:srlDrawableMarginRight="20dp"
            app:srlDrawableProgress="@drawable/ic_progress_hojder"/>
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
            tools:listitem="@android:layout/simple_list_item_2"/>
        <com.scwang.smartrefresh.layout.footer.ClassicsFooter
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>

</LinearLayout>

列表Item的布局文件如下:

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:orientation="vertical">
    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:text="我是第一个"
        android:textSize="15sp"
        android:textColor="@android:color/black"
        android:gravity="center_vertical"
        android:paddingLeft="12dp"/>
</LinearLayout>

这里我们在主布局中通过全类名的方式引入指定SmartRefreshLayout,并且添加了经典模式下的header和footer。

 

3、逻辑代码

这里通过RecyclerView模拟了一个数据列表的展示,提供下拉刷新和上拉加载的功能,在Activity中我们让它实现OnRefreshListener和OnLoadmoreListener这两个接口,重写onRefresh()和onLoadmore()两个方法,我们可以在这两个方法中具体去处理刷新和加载的逻辑,设置顶部Header样式为经典样式,具体方式为:

 

ClassicsHeader mClassicsHeader = (ClassicsHeader) mRefreshLayout.getRefreshHeader();
//        int deta = new Random().nextInt(7 * 24 * 60 * 60 * 1000);
//        mClassicsHeader.setLastUpdateTime(new Date(System.currentTimeMillis()-deta));
//        mClassicsHeader.setTimeFormat(new SimpleDateFormat("更新于 MM-dd HH:mm", Locale.CHINA));
        if (mClassicsHeader != null) {
            mClassicsHeader.setTimeFormat(new DynamicTimeFormat("更新于 %s"));
        }

        if (mClassicsHeader != null) {
            mDrawableProgress = mClassicsHeader.getProgressView().getDrawable();
        }
        if (mDrawableProgress instanceof LayerDrawable) {
            mDrawableProgress = ((LayerDrawable) mDrawableProgress).getDrawable(0);
        }

当我们需要设置页面自动刷新时,可以这样写:

mRefreshLayout.autoRefresh();

 

具体代码如下:

 

package com.archie.rxpracticies;

import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;

import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.scwang.smartrefresh.layout.listener.OnLoadmoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("RedundantCast")
public class MainActivity extends AppCompatActivity implements OnRefreshListener, OnLoadmoreListener {

    public static String TAG = "com.archie.rxpracticies";

    private RecyclerView mRecyclerView;
    private RefreshLayout mRefreshLayout;
    private Toolbar mToolbar;
    private Drawable mDrawableProgress;
    private List<String> mList = new ArrayList<>();
    private MyAdaper mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initListener();
        initData();
    }

    private void initData() {
        getStringData();
        setThemeColor(R.color.colorPrimary, R.color.colorPrimaryDark);
        mRefreshLayout.getLayout().setBackgroundResource(android.R.color.transparent);
        mRefreshLayout.setPrimaryColors(0, 0xff666666);
        if (Build.VERSION.SDK_INT >= 21) {
            mDrawableProgress.setTint(0xff666666);
        } else if (mDrawableProgress instanceof VectorDrawableCompat) {
            ((VectorDrawableCompat) mDrawableProgress).setTint(0xff666666);
        }
        mRefreshLayout.autoRefresh();
        //创建并设置Adapter
        Log.e(TAG, "" + mList.size());
        mAdapter = new MyAdaper(this, mList);
        mRecyclerView.setAdapter(mAdapter);
    }

    private void initListener() {
        mRefreshLayout.setOnRefreshListener(this);
        mRefreshLayout.setOnLoadmoreListener(this);
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRefreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        ClassicsHeader mClassicsHeader = (ClassicsHeader) mRefreshLayout.getRefreshHeader();
//        int deta = new Random().nextInt(7 * 24 * 60 * 60 * 1000);
//        mClassicsHeader.setLastUpdateTime(new Date(System.currentTimeMillis()-deta));
//        mClassicsHeader.setTimeFormat(new SimpleDateFormat("更新于 MM-dd HH:mm", Locale.CHINA));
        if (mClassicsHeader != null) {
            mClassicsHeader.setTimeFormat(new DynamicTimeFormat("更新于 %s"));
        }

        if (mClassicsHeader != null) {
            mDrawableProgress = mClassicsHeader.getProgressView().getDrawable();
        }
        if (mDrawableProgress instanceof LayerDrawable) {
            mDrawableProgress = ((LayerDrawable) mDrawableProgress).getDrawable(0);
        }

        //创建默认的线性LayoutManager
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        mRecyclerView.setHasFixedSize(true);
    }

    @Override
    public void onLoadmore(RefreshLayout refreshlayout) {
        refreshlayout.finishLoadmore(2000);
        mList.add("新增项");
        mAdapter.notifyDataSetChanged();
    }

    @Override
    public void onRefresh(RefreshLayout refreshlayout) {
        refreshlayout.finishRefresh(2000);
        if (mList.size() > 0) {
            mList.clear();
            getStringData();
            mAdapter.notifyDataSetChanged();
        }
    }

    private void getStringData() {
        for (int i = 1; i <= 20; i++) {
            mList.add("我是第" + i + "项");
        }
    }

    private void setThemeColor(int colorPrimary, int colorPrimaryDark) {
        mToolbar.setBackgroundResource(colorPrimary);
        mRefreshLayout.setPrimaryColorsId(colorPrimary, android.R.color.white);
        if (Build.VERSION.SDK_INT >= 21) {
            getWindow().setStatusBarColor(ContextCompat.getColor(this, colorPrimaryDark));
            mDrawableProgress.setTint(0xffffffff);
        } else if (mDrawableProgress instanceof VectorDrawableCompat) {
            ((VectorDrawableCompat) mDrawableProgress).setTint(0xffffffff);
        }
    }
}

适配器MyAdapter.java的代码如下:

 

 

package com.archie.rxpracticies;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Administrator on 2017\10\9 0009.
 * 适配器
 */

public class MyAdaper extends RecyclerView.Adapter<MyAdaper.ViewHolder> {
    private List<String> mList;
    private Context mContext;

    public MyAdaper(Context context, List<String> list) {
        this.mContext = context;
        this.mList = list;
    }

    //创建View,被LayoutManager使用
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_view, parent, false);
        return new ViewHolder(view);
    }

    //将数据与界面进行绑定的操作
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mList.get(position));
    }

    //获取数据的数量
    @Override
    public int getItemCount() {
        return mList.size();
    }

    //自定义的ViewHolder,持有每个Item的的所有界面元素
    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView mTextView;

        ViewHolder(View view) {
            super(view);
            mTextView = (TextView) view.findViewById(R.id.text);
        }
    }

}

这里在使用RecyclerView的时候有个坑,如果主布局控件高度设置的是match_parent,那么Item中高度不能设置为match_parent,否则会导致数据只展示一条。

 

以上内容就是我对这个库的一个使用说明,这里介绍的是最常规的用法,当然了,这个库十分强大,还有很多很牛逼的用法,我也在慢慢探索,相信我的文章大家都能很容易看懂,如果大家不想看的,我这里给出这个库的源地址,希望大家去github上面详细的查看对应的使用说明,最好是能把它的Demo下载下来自己跑一遍看看,因为里面有很多很酷炫的效果,万一哪天你们的产品汪就提出了一样的需求呢?谢谢大家的观看,欢迎批评指正。

SmartRefreshLayout的项目地址https://github.com/scwang90/SmartRefreshLayout

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android智能下拉刷新框架—SmartRefreshLayout的使用 的相关文章

随机推荐

  • QRCode简单生成二维码

    QRCode简单生成二维码 1 导包 2 jsp的body里 div div
  • 通讯录_Php通讯录系统

    点击上面 蓝字 关注我们 Php通讯录系统 address list 主页 通讯录系统 管理员登录 登录 注册 后台 通讯录系统 编辑 代码 include conn conn php url SERVER REQUEST URI url
  • Maven settings.xml文件中各配置项的详细说明

    1 Maven settings xml文件中各配置项的说明 localRepository 本地仓库 指定Maven本地仓库的路径 默认情况下 它位于用户主目录下的 m2文件夹中
  • Windows系统设置每天自动备份指定文件并自动删除七天前的文件(脚本+Windows任务计划)

    Windows系统设置每天自动备份指定文件并自动删除七天前的文件 脚本 Windows任务计划 在生活中和工作中有时候为了避免电脑宕机导致文件丢失常常会使用一些方式去备份文件 今天小编给大家介绍一个方法 用于自动备份指定文件 并删除N天前的
  • 射击游戏c语言源码,射击游戏 (C++代码)

    解题思路 路 一开始不理解假定A和B都足够聪明 采取让自己获胜概率尽量高的策略 你的任务是计算出A获胜的概率 其实就是说在任意一种方式下都是取得胜利的最大概率 所以要从所有可能的情况 1 6行 从左or从右 里取一个最大的 那么直接去dfs
  • Redis 的五种基本类型(实战篇)

    良心公众号 关注不迷路 Redis 是一个速度非常快的非关系型数据库 它可以存储键 key 与 5 种不同类型的值 value 之间的映射 可以将存储在内存的键值对数据持久化到硬盘 可以使用复制特性来扩展读性能 还可以使用客户端分片来扩展性
  • 【python爬虫】爬取淘宝网商品信息

    相信学了python爬虫 很多人都想爬取一些数据量比较大的网站 淘宝网就是一个很好的目标 其数据量大 而且种类繁多 而且难度不是很大 很适合初级学者进行爬取 下面是整个爬取过程 第一步 构建访问的url 构建访问的url goods 鱼尾裙
  • 基于ensp的校园无线网络仿真实验

    写在前面 本项目是我们大三的一堂实践课作业内容 之前发过一次但是瞬间反响很好所以怕被抄袭删掉了555 现在成绩也出了尘埃落定发出来和大货分享分享qwq 当然还是仅供学习参考 禁止洗稿噢 摘要 本论文研究了一个基于有线和无线网络的校园网项目的
  • Jmeter完整的性能测试流程图,接口测试步骤

    第零 300G全套最新软测视频教程分享 链接 https pan baidu com s 17jkyGn Wm zC6QQLkWjrsw 提取码 o94n 第一 测试相关系统准备 1 验证基本系统功能后 性能测试在哪个阶段开始介入 通常 最
  • C++使用protobuf实现序列化与反序列化

    一 protobuf简介 1 1 protobuf的定义 protobuf是用来干嘛的 protobuf是一种用于 对结构数据进行序列化的工具 从而实现 数据存储和交换 主要用于网络通信中 收发两端进行消息交互 所谓的 结构数据 是指类似于
  • linux 目录大小 4096,Linux 块与文件大小

    EXT2格式 块大小为1024字节的话 单一文件最大容量是16GB 块大小为4096字节的话 单一文件最大容量为2TB 如果你愿意 看看kernel源代码吧 位置 fs ext2 supper c 看这个函数 C C code Maxima
  • FTP、SFTP文件下载内容校验

    描述 从FTP SFTP下载的文件做MD5码校验 文件名和MD5码值存放在表格里 表格位置在FTP SFTP服务器上 os模块只能遍历本地目录 文件 需要先连接FTP SFTP服务器 将表格下载到本地localpath 再将localpat
  • mysql 添加索引后 在查询的时候是mysql就自动从索引里面查询了。还是查询的时候有单 独的参数查询索引?

    MYSQL在创建索引后对索引的使用方式分为两种 1 由数据库的查询优化器自动判断是否使用索引 2 用户可在写SQL语句时强制使用索引 下面就两种索引使用方式进行说明 第一种 自动使用索引 数据库在收到查询语句后会查看where语句后面的查询
  • 如何将自己造的轮子,发布npm包,并使用

    参考该篇文章 实例创建自己的npm包 发布npm包并使用 https segmentfault com a 1190000039766438
  • 复杂曲面建模_Rhino 7

    Rhino 和 Sketchup之间的 斗争 已经持续了好长时间 双方基本态度是 呵 你很好用 但我也可以啊 这种争议的底层原因是因为他们无法互通 我们并没有听说过Rhino和Revit有矛盾 也没听说过Sketchup和AutoCAD有什
  • C++系列目录

    基础语言篇 C 数据类型 C位操作 C预编译处理 C指针 C结构体与枚举类型 C 函数 C 虚函数 C 容器与算法 C 类 C I O处理 C 重载操作符与转换 模板与泛型 C C 编译和调试 C C 动态链接 C C 通用MakeFile
  • element表格默认选中

    场景 选中表格多选框后 重新返回这个标签页 已经选择的需要默认选中 但是重新返回后 并没有选中
  • 流计算框架 Flink 与 Storm 的性能对比

    概述 将分布式实时计算框架 Flink 与 Storm 进行性能对比 为实时计算平台和业务提供数据参考 一 背景 Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架 其中 Apache Sto
  • 04-分布式资源管理系统YARN

    目录 一 YARN简介 1 YARN的由来 2 什么是YARN 二 YARN原理 1 系统架构 1 1 角色分工 1 2 设计思想 1 3 工作机制 1 4 集群部署 2 YARN高可用 三 YARN资源调度策略 1 FIFO调度器 2 容
  • Android智能下拉刷新框架—SmartRefreshLayout的使用

    转载请注明出处 http blog csdn net jarchie520 article details 78193387 上个月因为自己太懒了 加上又发生了一点小事 就没能及时更新博客 下了班回家面壁思过去吧 今天这篇文章主要是介绍一下