Android 列表頁面終極封裝:SmartRefreshLayout + BRVAH 實現下拉刷新和加載更多

在 Android 開發中,列表頁面是常見的 UI 設計模式,而下拉刷新和加載更多是提升用戶體驗的關鍵功能。本文將帶你從零開始,封裝一個高復用性的 SmartRefreshHelper 工具類,結合 SmartRefreshLayoutBRVAH,實現高效、靈活的列表頁面。你將學到:

  • 如何封裝 SmartRefreshHelper 工具類,簡化列表頁面的實現。
  • 支持下拉刷新、加載更多、空布局和加載更多失敗處理。
  • 通過代碼示例和布局文件,快速上手并應用到實際項目中。

包括 SmartRefreshLayoutBRVAH 的封裝下拉刷新和加載更多功能空布局支持加載更多失敗處理 以及 網絡請求封裝。所有內容都經過優化,確保代碼簡潔、高效且易于擴展。


1. 添加依賴

build.gradle 中添加以下依賴:

dependencies {// SmartRefreshLayout 下拉刷新和加載更多implementation 'io.github.scwang90:refresh-layout-kernel:2.0.6' // 核心庫implementation 'io.github.scwang90:refresh-header-classics:2.0.6' // 經典刷新頭implementation 'io.github.scwang90:refresh-footer-classics:2.0.6' // 經典加載更多// BRVAH 高效適配器implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.14'
}

2. 布局文件

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smart.refresh.layout.SmartRefreshLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/refreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"><!-- RecyclerView --><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"/></com.scwang.smart.refresh.layout.SmartRefreshLayout>
item_layout.xml
<?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="wrap_content"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Item"android:textSize="18sp"/>
</LinearLayout>
empty_layout.xml
<?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"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="No data available"android:textSize="18sp"/>
</LinearLayout>

3. 封裝 SmartRefreshHelper 工具類

import android.app.Activity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
import java.util.List;/*** 封裝 SmartRefreshLayout 和 BRVAH 的工具類* 功能:支持下拉刷新、加載更多、空布局和加載更多失敗處理*/
public class SmartRefreshHelper<T> {private final Activity activity;private final RefreshLayout refreshLayout;private final RecyclerView recyclerView;private final BaseQuickAdapter<T, ?> adapter;private final DataLoader<T> dataLoader;private int page = 1; // 當前頁碼/*** 構造函數** @param activity         Activity 實例* @param refreshLayoutId  SmartRefreshLayout 的 ID* @param recyclerViewId   RecyclerView 的 ID* @param adapter          數據適配器* @param dataLoader       數據加載器*/public SmartRefreshHelper(Activity activity, int refreshLayoutId, int recyclerViewId,BaseQuickAdapter<T, ?> adapter, DataLoader<T> dataLoader) {this.activity = activity;this.refreshLayout = activity.findViewById(refreshLayoutId);this.recyclerView = activity.findViewById(recyclerViewId);this.adapter = adapter;this.dataLoader = dataLoader;// 初始化 RecyclerViewrecyclerView.setLayoutManager(new LinearLayoutManager(activity));recyclerView.setAdapter(adapter);// 設置下拉刷新和加載更多監聽器initRefreshListener();}/*** 初始化下拉刷新和加載更多監聽器*/private void initRefreshListener() {// 下拉刷新refreshLayout.setOnRefreshListener((RefreshLayout refreshLayout) -> {page = 1; // 重置頁碼loadData(page, true); // 加載第一頁數據});// 加載更多refreshLayout.setOnLoadMoreListener((RefreshLayout refreshLayout) -> {page++; // 加載下一頁loadData(page, false);});}/*** 加載數據** @param page     當前頁碼* @param isRefresh 是否是刷新操作*/private void loadData(int page, boolean isRefresh) {dataLoader.loadData(page, new DataLoader.Callback<T>() {@Overridepublic void onSuccess(List<T> data) {if (isRefresh) {adapter.setList(data); // 刷新數據refreshLayout.finishRefresh(); // 結束刷新} else {adapter.addData(data); // 添加更多數據refreshLayout.finishLoadMore(); // 結束加載更多}}@Overridepublic void onFailure(String message) {if (isRefresh) {refreshLayout.finishRefresh(false); // 刷新失敗} else {refreshLayout.finishLoadMore(false); // 加載更多失敗}}});}/*** 設置空布局** @param emptyLayoutId 空布局的資源 ID*/public void setEmptyView(int emptyLayoutId) {adapter.setEmptyView(emptyLayoutId);}/*** 數據加載器接口*/public interface DataLoader<T> {void loadData(int page, Callback<T> callback);interface Callback<T> {void onSuccess(List<T> data);void onFailure(String message);}}
}

4. 適配器實現

MyAdapter
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import java.util.List;public class MyAdapter extends BaseQuickAdapter<String, BaseViewHolder> {public MyAdapter(List<String> data) {super(R.layout.item_layout, data);}@Overrideprotected void convert(@NonNull BaseViewHolder holder, String item) {// 綁定數據到視圖holder.setText(R.id.textView, item);}
}

5. 在 Activity 中使用

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private SmartRefreshHelper<String> smartRefreshHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化適配器MyAdapter adapter = new MyAdapter(new ArrayList<>());// 初始化 SmartRefreshHelpersmartRefreshHelper = new SmartRefreshHelper<>(this,R.id.refreshLayout,R.id.recyclerView,adapter,new SmartRefreshHelper.DataLoader<String>() {@Overridepublic void loadData(int page, SmartRefreshHelper.DataLoader.Callback<String> callback) {// 模擬網絡請求new Handler().postDelayed(() -> {List<String> data = getData(page); // 獲取數據if (data.isEmpty()) {callback.onFailure("No more data"); // 加載失敗} else {callback.onSuccess(data); // 加載成功}}, 2000); // 2秒延遲}});// 設置空布局smartRefreshHelper.setEmptyView(R.layout.empty_layout);// 首次加載數據smartRefreshHelper.loadData(1, true);}/*** 模擬獲取數據** @param page 當前頁碼* @return 數據列表*/private List<String> getData(int page) {List<String> data = new ArrayList<>();for (int i = 0; i < 10; i++) {data.add("Item " + (page * 10 + i));}return data;}
}

6. 優勢

  1. 空布局支持:當數據為空時顯示提示。
  2. 加載更多失敗處理:提升用戶體驗。
  3. 網絡請求封裝:通過 DataLoader 接口解耦網絡請求邏輯。
  4. 代碼復用性優化:通過泛型支持多種數據類型。
  5. 簡潔高效:邏輯清晰,易于維護和擴展。

7. 總結

通過優化后的 SmartRefreshHelper,我們實現了一個功能強大且靈活的列表頁面,支持下拉刷新、加載更多、空布局和加載更多失敗處理。這種封裝方式不僅提高了代碼的復用性,還簡化了開發流程。

核心功能
  • 下拉刷新:重置數據并加載第一頁。
  • 加載更多:追加數據并加載下一頁。
  • 空布局:當數據為空時顯示提示。
  • 加載更多失敗處理:提升用戶體驗。
擴展功能
  • 自定義刷新頭和加載更多:滿足個性化需求。
  • 支持多種數據類型:通過泛型實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72149.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css基本功

為什么 ::first-letter 是偽元素&#xff1f; ::first-letter 的作用是選擇并樣式化元素的第一個字母&#xff0c;它創建了一個虛擬的元素來包裹這個字母&#xff0c;因此屬于偽元素。 grid布局 案例一 <!DOCTYPE html> <html lang"zh-CN"><head&…

基于WebRTC技術的EasyRTC嵌入式音視頻SDK:多平臺兼容與性能優化

在當今數字化、智能化的時代背景下&#xff0c;實時音視頻通信技術已成為眾多領域不可或缺的關鍵技術。基于WebRTC技術的EasyRTC嵌入式音視頻SDK&#xff0c;憑借其在ARM、Linux、Windows、安卓、iOS等多平臺上的兼容性&#xff0c;為開發者提供了強大的工具&#xff0c;推動了…

【Pandas】pandas Series last_valid_index

Pandas2.2 Series Time Series-related 方法描述Series.asfreq(freq[, method, how, …])用于將時間序列數據轉換為指定的頻率Series.asof(where[, subset])用于返回時間序列中指定索引位置的最近一個非缺失值Series.shift([periods, freq, axis, …])用于將時間序列數據沿指…

批量將 Excel 文檔中的圖片提取到文件夾

前面我們介紹過如何批量刪除 Excel 文檔中的所有圖片或者指定的圖片&#xff0c;其中就需要用到批量提取 Excel 文檔中圖片的操作。我們如何才能夠將 Excel 文檔中的圖片快速的提取出來呢&#xff1f;其實單個 Excel 文檔中的圖片提取到文件夾中是有多種方法可以完成的&#xf…

【氮化鎵】開態GaN HEMTs中氧誘導Vth漂移的缺陷演化

2019年,中國工程物理研究院電子工程研究所的Rong Wang等人基于實驗研究和第一性原理計算,研究了開啟態偏置下AlGaN/GaN高電子遷移率晶體管(HEMTs)中氧誘導的閾值電壓(Vth)漂移的缺陷演化機理。實驗結果表明,在開啟態應力作用下,T型柵AlGaN/GaN HEMT的Vth發生了明顯的負…

谷粒商城:性能壓測JVM堆區

目錄 Kit Apache JMeter VisualVM 堆內存 jvm內存模型 垃圾回收&#xff08;Garbage Collection, GC&#xff09; 新對象分配內存 GC步驟 MinorGC 性能優化 影響因素 優化 nginx動靜分離 優化三級分類獲取 Jvm參數配置堆區 測試 Kit Apache JMeter 壓力測試&…

STM32全系大閱兵(2)

接前一篇文章:STM32全系大閱兵(1) 本文內容參考: STM32家族系列的區別_stm32各個系列區別-CSDN博客 STM32--STM32 微控制器詳解-CSDN博客

7、基于osg引擎實現讀取vtk數據通過著色器實現簡單體渲染(1)

1、頂點著色器代碼 #version 110 /* GLSL 1.10需要顯式聲明精度 (OpenGL ES要求) */ #ifdef GL_ES precision highp float; #endif // 體數據采樣步長 uniform float xStepSize,yStepSize,zStepSize; // 體數據紋理和顏色紋理 uniform sampler3D baseTexture; uniform sample…

基于Ollama平臺部署的Qwen大模型實現聊天機器人

文章目錄 基于Ollama平臺部署的Qwen大模型實現聊天機器人1 概述2 技術棧2.1 開發技術2.2 環境 3 實現步驟3.1 環境搭建3.1.1 WSL配置及Ubuntu安裝3.1.2 Ollama安裝及模型部署 3.2 模塊安裝3.2.1 安裝Streamlit 1.42.23.2.2 安裝requests 2.32.33.2.3 安裝ollama 0.4.7 3.3 后端…

用DasViewer的時候3Dtiles 轉osgb 可以直接指定目標坐標系嗎?

沒有指定坐標系選項&#xff0c;可以轉換后&#xff0c;再進行一次坐標系轉換。 DasViewer是一款免費極速實景三維模型瀏覽器&#xff0c;采用多細節層次模型逐步自適應加載技術,讓用戶在極低的電腦配置下,也能流暢的加載較大規模實景三維模型,提供方便快捷的數據瀏覽操作。 目…

【MySQL】MySQL服務器——mysqld

1.MySQL服務器 是名為 mysqld 的數據庫服務器程序&#xff0c;和“主機”&#xff08;host&#xff09;不一樣是一個多線程的單進程管理對磁盤和內存中數據庫的訪問支持并發的客戶端連接支持多個存儲引擎&#xff0c;常見的存儲引擎包括InnoDB、MyISAM、Memory、Archive支持事…

vue啟動 localhost無法訪問

1. localhost 和 127.0.0.1 雖然都指向本機&#xff0c;但它們有細微的區別&#xff1a; - localhost 是一個域名&#xff0c;需要通過 DNS 解析或本地 hosts 文件解析為 IP 地址 - 127.0.0.1 是直接的 IP 地址&#xff0c;不需要解析過程 2. 無法訪問 localhost 的可…

爬蟲案例十三js逆向模擬登錄中大網校

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、網站分析二、代碼 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; js 逆向模擬登錄中大網校 提示&#xff1a;以下是本篇文章正文內…

Java IO 與文件系統:File 類與流操作詳解

在 Java 編程中&#xff0c;IO&#xff08;輸入輸出&#xff09;操作是處理文件和數據流的核心部分。本文將圍繞文件系統、硬盤存儲、Java 的 File 類以及 InputStream 和 OutputStream 的使用進行詳細總結&#xff0c;幫助讀者全面掌握 Java IO 編程的核心知識。 一、IO、存儲…

我與DeepSeek讀《大型網站技術架構》(13)- 大型網站典型故障案例分析

文章目錄 第13章 大型網站典型故障案例分析日志管理缺陷引發的故障高并發數據庫訪問問題鎖機制濫用導致服務超時緩存運維不當引發的全站癱瘓流程不規范導致的線上事故編程習慣問題引發功能異常生產環境濫用問題其他典型問題總結 第13章 大型網站典型故障案例分析 本章通過九個…

Git與GitHub:它們是什么,有什么區別與聯系?

1.Git是什么&#xff1f; Git 是一個開源的、分布式版本控制系統&#xff08;Version Control System, VCS&#xff09;&#xff0c;由 Linus Torvalds 于 2005 年開發&#xff0c;最初用于管理 Linux 內核的開發。它的核心功能是跟蹤文件的變更歷史&#xff0c;幫助開發者高效…

江科大51單片機筆記【12】AT24C02(I2C總線)

寫在前言 此為博主自學江科大51單片機&#xff08;B站&#xff09;的筆記&#xff0c;方便后續重溫知識 在后面的章節中&#xff0c;為了防止篇幅過長和易于查找&#xff0c;我把一個小節分成兩部分來發&#xff0c;上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論知識…

ClickHouse SQL優化:從原理到實戰的深度指南

目錄 ?ClickHouse架構核心解析 1.1 列式存儲的利刃與短板 1.2 MergeTree引擎的物理存儲密碼 1.3 向量化執行引擎的運算革命 ?數據建模的黃金法則 2.1 分區鍵設計的二十倍性能差異實驗 2.2 主鍵排序的磁盤命中率法則 2.3 稀疏索引的數學選擇策略 ?SQL優化十誡 3.1 查詢模式反…

面試之《前端常見的設計模式》

前端開發中運用多種設計模式可以提高代碼的可維護性、可擴展性和可復用性。以下是一些常見的前端設計模式&#xff1a; 創建型模式 1. 單例模式 定義&#xff1a;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。應用場景&#xff1a;在前端中&#xff0c;像全局狀…

Unity Android出包

Unity Android出包 1.Android Studio版本 不能高于Unity的版本 2.so庫 這個庫需要自己拷貝到Android工程當中 3.JDK版本太老 編譯可以正常&#xff0c;但無法運行 File->ProjectStructure->SDK Location->Gradle Setting->Gradle JDK->X:/Android Stuido/jre …