安卓RefreshLayout实现下拉刷新上滑加载以及数据去重的列表页

本文介绍了如何在Android项目中使用RefreshLayout实现下拉刷新和上滑加载功能,并结合数据去重技术,确保列表页数据的唯一性。通过添加依赖、设置布局文件,以及编写业务逻辑,展示了如何在RecycleView中加载本地缓存数据,以及在下拉刷新和上拉加载时处理数据请求和更新。
摘要由CSDN通过智能技术生成

在项目中app的build.gradle添加以下依赖:

//RefreshLayout
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0'

//glide用于加载item中的图片
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

首先来绘制一个简单的列表页布局:

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

    <com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/refreshLayout"
        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="match_parent"
            android:overScrollMode="never">
        </android.support.v7.widget.RecyclerView>
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>

</LinearLayout>

然后绘制一下RecycleView中需要加载的item布局:

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

    <RelativeLayout
        android:id="@+id/notice"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:background="#FFFFFF">

        <TextView
            android:id="@+id/title"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:gravity="top"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp"
            android:text="发布一条很重要的公告"
            android:textColor="#000000"
            android:textSize="20dp"/>

        <TextView
            android:id="@+id/description"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="10dp"
            android:text="今天宿舍发布一条很重要的公告啊,我是公告的简介呢!今天宿舍发布一条很重要的公告啊,我是公告的简介呢!"
            android:layout_below="@+id/title"
            android:textSize="14dp"/>

        <ImageView
            android:id="@+id/img"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:scaleType="fitCenter"
            >
        </ImageView>

        <TextView
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="10dp"
            android:text="2020/02/02 15:30"
            android:textSize="16dp"/>

    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="10dp">
    </View>

</LinearLayout>

以下是item效果图:
在这里插入图片描述

在绘制一个提示没有数据的空页面布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <ImageView
            android:layout_width="200dp"
            android:layout_height="220dp"
            android:layout_gravity="center"
            android:layout_marginTop="200dp"
            android:background="@drawable/cry"
            >
        </ImageView>
        <TextView
            android:id="@+id/layout_tishi"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textColor="#000000"
            android:textSize="26dp"
            android:text="没有找到任何数据"
            android:gravity="center"
            >
        </TextView>
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

在这里插入图片描述

然后整理一下业务逻辑流程(这里示例中数据进行本地缓存,想了解的请看另一篇关于Banner的博文):

①打开APP后请求服务器获取相关数据,若有数据则渲染item并通过适配器加载到RecycleView中,若无数据则加载空页面布局。②下拉刷新时请求服务器数据并重置RecycleView并重新渲染加载item。③上拉加载使用分页的逻辑加载下一页数据并更新在RecycleView中,此步需要对数据进行去重,以免由于加载时有新数据导致原本下一页的数据与之前数据重复。

接下来直接贴出完整代码,重要部分在注释中说明,这里示例使用的是Fragment,请根据自己项目适当修改,这里只演示流程和基本逻辑。

public class main_tab_zixun extends Fragment {
   

    static RecyclerView recycleview;
    static int haveData = 0;	//当前列表数据条数
    static int total = 0;		//上次刷新时获取数据总条数
    static List<Map<String,String>> mDatas = new ArrayList<Map<String, String>
基于SwipeRefreshLayout下拉刷新、上拉加载。支持所有的AbsListView、RecycleView 特点  在 layout 中使用,支持 AbsListView 所有的xml属性  支持自动下拉刷新,什么用呢?比如进入界面时,只需要调用 autoRefresh() 方法即可,同时下拉刷新回调函数将会被调用。  上拉加载支持自定义 View 或设置加载文字、动画  轻松设置 Adapter 空数据视图,默认为 TextView 支持更文字,也可自定义 View  对于简单的界面,如只有 ListView 可以继承 app 包中 Fragment 轻松搞定 效果图 使用 仔细看 listSelector 属性,效果见 sample <com.mylhyl.prlayout.SwipeRefreshListView xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@ id/swipeRefresh"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:listSelector="@drawable/selector_list"     tools:context=".app.ListViewXmlFragment" /> 设置上拉加载,更多方法见 IFooterLayout         IFooterLayout footerLayout = swipeRefreshListView.getFooterLayout();         footerLayout.setFooterText("set自定义加载");         footerLayout.setIndeterminateDrawable(getResources().getDrawable(R.drawable.footer_progressbar)); 自定义adapter空数据视图         ImageView emptyView = new ImageView(getContext());         emptyView.setImageResource(R.mipmap.empty);         swipeRefreshGridView.setEmptyView(emptyView); 或         swipeRefreshListView.setEmptyText("数据呢?"); 使用Gradle构建时添加一下依赖即可: compile 'com.mylhyl:pullrefreshlayout:1.0.0' QQ交流群:435173211
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值