Android 實例 - 分頁器封裝實現(上一頁按鈕、下一頁按鈕、當前頁碼 / 總頁數、每頁條數、總記錄數)

一、需求

  • 分頁器需要包含:【上一頁按鈕】、【下一頁按鈕】、【當前頁碼 / 總頁數】、【每頁條數】、【總記錄數】
  1. 點擊【上一頁按鈕】,渲染上一頁的數據,如果當前頁碼為第一頁,則禁用【上一頁按鈕】

  2. 點擊【下一頁按鈕】,渲染下一頁的數據,如果當前頁碼為最后一頁,則禁用【下一頁按鈕】

  3. 點擊【當前頁碼 / 總頁數】,彈出對話框,可以選擇頁碼,選擇頁碼后,渲染該頁碼的數據


二、具體實現

1、Entity
  1. Student.java
package com.my.paging.model.entity;public class Student {private int id;private String name;private int age;public Student() {}public Student(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
  1. PageResult.java
package com.my.paging.model.entity;import java.util.List;public class PageResult<T> {private int pageNum;private int pageSize;private int pageTotal;private int total;private List<T> data;public PageResult() {}public PageResult(int pageNum, int pageSize, int pageTotal, int total, List<T> data) {this.pageNum = pageNum;this.pageSize = pageSize;this.pageTotal = pageTotal;this.total = total;this.data = data;}public int getPageNum() {return pageNum;}public void setPageNum(int pageNum) {this.pageNum = pageNum;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getPageTotal() {return pageTotal;}public void setPageTotal(int pageTotal) {this.pageTotal = pageTotal;}public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public List<T> getData() {return data;}public void setData(List<T> data) {this.data = data;}
}
2、Repository
  • StudentRepository.java
package com.my.paging.repository;import com.my.paging.model.entity.PageResult;
import com.my.paging.model.entity.Student;import java.util.ArrayList;
import java.util.List;public class StudentRepository {private List<Student> students;private static final int TOTAL = 100;public StudentRepository() {students = new ArrayList<>();for (int i = 0; i < TOTAL; i++) {int id = i + 1;students.add(new Student(id,"test " + id,20));}}public PageResult<Student> getStudents(int pageNum, int pageSize) {int start = (pageNum - 1) * pageSize;int end = start + pageSize;if (end > TOTAL) {end = TOTAL;}List<Student> data = students.subList(start, end);PageResult<Student> pageResult = new PageResult<>();pageResult.setPageNum(pageNum);pageResult.setPageSize(pageSize);pageResult.setPageTotal((TOTAL + pageSize - 1) / pageSize);pageResult.setTotal(TOTAL);pageResult.setData(data);return pageResult;}
}
3、RecyclerView
(1)Layout
  • recycler_view_item_student.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/tv_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp" /><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="4dp"android:textSize="18sp"android:textStyle="bold" /><TextViewandroid:id="@+id/tv_age"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="4dp"android:textSize="16sp" />
</LinearLayout>
(2)Adapter
  • StudentRecyclerViewAdapter.java
package com.my.paging.adapter;import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.my.paging.R;
import com.my.paging.model.entity.Student;import java.util.List;public class StudentRecyclerViewAdapter extends RecyclerView.Adapter<StudentRecyclerViewAdapter.StudentRecyclerViewViewHolder> {private List<Student> students;public StudentRecyclerViewAdapter() {}public void setStudents(List<Student> students) {this.students = students;notifyDataSetChanged();}@NonNull@Overridepublic StudentRecyclerViewViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = View.inflate(parent.getContext(), R.layout.recycler_view_item_student, null);return new StudentRecyclerViewViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull StudentRecyclerViewViewHolder holder, int position) {holder.bind(students.get(position));}@Overridepublic int getItemCount() {if (students == null) return 0;return students.size();}static class StudentRecyclerViewViewHolder extends RecyclerView.ViewHolder {private TextView tvId;private TextView tvName;private TextView tvAge;public StudentRecyclerViewViewHolder(@NonNull View itemView) {super(itemView);tvId = itemView.findViewById(R.id.tv_id);tvName = itemView.findViewById(R.id.tv_name);tvAge = itemView.findViewById(R.id.tv_age);}public void bind(Student student) {tvId.setText(String.valueOf(student.getId()));tvName.setText(student.getName());tvAge.setText(String.valueOf(student.getAge()));}}
}
4、PaginationView
(1)Layout
  • pagination_view.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="8dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_prev"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginEnd="8dp"android:enabled="false"android:text="上一頁" /><LinearLayoutandroid:id="@+id/ll_page_num_and_page_total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="8dp"><TextViewandroid:id="@+id/tv_page_num"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="1" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="/" /><TextViewandroid:id="@+id/tv_page_total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="1" /></LinearLayout><Buttonandroid:id="@+id/btn_next"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="8dp"android:text="下一頁" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal"><LinearLayoutandroid:id="@+id/ll_page_size"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/tv_page_size"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="10"android:textSize="12sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text=" 條/頁"android:textSize="12sp" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textSize="12sp" /><TextViewandroid:id="@+id/tv_total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="0"android:textSize="12sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textSize="12sp" /></LinearLayout></LinearLayout>
</LinearLayout>
(2)Observer
  • OnPageChangeObserver.java
package com.my.paging.customview.observer;public interface OnPageChangeObserver {void onPageChange(int newPageNum);
}
(3)Code
  • PaginationView.java
package com.my.paging.customview;import android.app.AlertDialog;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;import androidx.annotation.Nullable;import com.my.paging.R;
import com.my.paging.customview.observer.OnPageChangeObserver;public class PaginationView extends LinearLayout {private Context context;private TextView tvPageNum;private TextView tvPageSize;private TextView tvPageTotal;private TextView tvTotal;private Button btnPrev;private Button btnNext;private LinearLayout llPageNumAndPageTotal;private int pageNum = 1;private int pageSize = 10;private int pageTotal = 0;private int total = 0;private String[] pageItems;private OnPageChangeObserver onPageChangeObserver;public PaginationView(Context context) {super(context);init(context);}public PaginationView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context);}public PaginationView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}public PaginationView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);init(context);}private void init(Context context) {this.context = context;LayoutInflater.from(context).inflate(R.layout.pagination_view, this, true);tvPageNum = findViewById(R.id.tv_page_num);tvPageSize = findViewById(R.id.tv_page_size);tvPageTotal = findViewById(R.id.tv_page_total);tvTotal = findViewById(R.id.tv_total);btnPrev = findViewById(R.id.btn_prev);btnNext = findViewById(R.id.btn_next);llPageNumAndPageTotal = findViewById(R.id.ll_page_num_and_page_total);btnPrev.setOnClickListener(v -> {pageNum--;tvPageNum.setText(String.valueOf(pageNum));if (onPageChangeObserver != null) {onPageChangeObserver.onPageChange(pageNum);}});btnNext.setOnClickListener(v -> {pageNum++;tvPageNum.setText(String.valueOf(pageNum));if (onPageChangeObserver != null) {onPageChangeObserver.onPageChange(pageNum);}});llPageNumAndPageTotal.setOnClickListener(view -> {pageItems = new String[pageTotal];for (int i = 0; i < pageTotal; i++) {pageItems[i] = "第 " + (i + 1) + " 頁";}AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle("選擇頁碼");builder.setSingleChoiceItems(pageItems, -1, (dialog, which) -> {dialog.dismiss();pageNum = which + 1;tvPageNum.setText(String.valueOf(pageNum));if (onPageChangeObserver != null) {onPageChangeObserver.onPageChange(pageNum);}});AlertDialog alertDialog = builder.create();alertDialog.show();});}public void setOnPageChangeObserver(OnPageChangeObserver onPageChangeObserver) {this.onPageChangeObserver = onPageChangeObserver;}public void render(int pageNum, int pageSize, int pageTotal, int total) {this.pageNum = pageNum;this.pageSize = pageSize;this.pageTotal = pageTotal;this.total = total;tvPageNum.setText(String.valueOf(pageNum));tvPageSize.setText(String.valueOf(pageSize));tvPageTotal.setText(String.valueOf(pageTotal));tvTotal.setText(String.valueOf(total));btnPrev.setEnabled(pageNum > 1);btnNext.setEnabled(pageNum < pageTotal);}
}
5、Activity
(1)Layout
  • activity_pagination_view_test.xml
<?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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".PaginationViewTestActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_student"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /><com.my.paging.customview.PaginationViewandroid:id="@+id/pv_student"android:layout_width="match_parent"android:layout_height="wrap_content" />
</LinearLayout>
(2)Code
  • PaginationViewTestActivity.java
package com.my.paging;import android.os.Bundle;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.my.paging.adapter.StudentRecyclerViewAdapter;
import com.my.paging.customview.PaginationView;
import com.my.paging.model.entity.PageResult;
import com.my.paging.model.entity.Student;
import com.my.paging.repository.StudentRepository;import java.util.List;public class PaginationViewTestActivity extends AppCompatActivity {private RecyclerView rvStudent;private PaginationView pvStudent;private int pageNum = 1;private int pageSize = 15;private int pageTotal = 0;private int total = 0;private List<Student> students;private StudentRepository studentRepository;private StudentRecyclerViewAdapter studentRecyclerViewAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_pagination_view_test);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});rvStudent = findViewById(R.id.rv_student);pvStudent = findViewById(R.id.pv_student);pvStudent.setOnPageChangeObserver(newPageNum -> {pageNum = newPageNum;doRequest();doRender();});studentRepository = new StudentRepository();studentRecyclerViewAdapter = new StudentRecyclerViewAdapter();rvStudent.setAdapter(studentRecyclerViewAdapter);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);rvStudent.setLayoutManager(linearLayoutManager);DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);rvStudent.addItemDecoration(dividerItemDecoration);doRequest();doRender();}private void doRequest() {PageResult<Student> pageResult = studentRepository.getStudents(pageNum, pageSize);pageTotal = pageResult.getPageTotal();total = pageResult.getTotal();students = pageResult.getData();}private void doRender() {pvStudent.render(pageNum, pageSize, pageTotal, total);studentRecyclerViewAdapter.setStudents(students);}
}

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

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

相關文章

從代碼學習深度強化學習 - SAC PyTorch版

文章目錄 前言 SAC處理連續動作空間問題 (Pendulum-v1) 核心代碼實現 **工具函數與環境初始化** **ReplayBuffer、網絡結構與SAC算法** **訓練與結果** SAC處理離散動作空間問題 (CartPole-v1) 核心代碼實現 **工具函數與環境初始化** **ReplayBuffer、網絡結構與SAC算法 (離散…

物聯網安裝調試-溫濕度傳感器

以下為溫濕度傳感器在物聯網安裝調試中的全流程技術指南,涵蓋選型、安裝、調試及故障排查,結合工業/農業/家居三大場景實操要點: 一、傳感器選型核心參數表 參數 工業場景 農業大棚 智能家居 選型建議 精度 0.5℃/1.5%RH 1℃/3%RH 1℃/5%RH 工業級首選Sensirion SHT3x系列 防…

MySQL 核心知識點梳理(1)

目錄 1.什么是數據庫? 關系型數據庫 非關系型數據庫 2.Mysql出現性能差的原因? 3.MySQL的內聯,左外聯,右外連接的區別 4.為什么要有三大范式 建表需要考慮的問題? char和varchar的區別 blob和text的區別? DATETIME和TIMESTAMP的區別 in和exists的區別 null值陷 …

Word快速文本對齊程序開發經驗:從需求分析到實現部署

在日常辦公中&#xff0c;文檔排版是一項常見但耗時的工作&#xff0c;尤其是當需要處理大量文本并保持格式一致時。Microsoft Word作為最流行的文檔處理軟件之一&#xff0c;雖然提供了豐富的排版功能&#xff0c;但在處理復雜的文本對齊需求時&#xff0c;往往需要重復執行多…

力扣面試150(34/150)

7.20 242. 有效的字母異位詞 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的 字母異位詞 我的思路&#xff1a; 遍歷s到一個sMap&#xff0c;字母次數的方式遍歷t&#xff0c;判斷t中的char是否在sMap當中&#xff0c;如果在的話次數-1&#xff0c;判…

軟件工程:可行性分析的任務及報告

簡介 本博客圍繞軟件工程中的第一關——“可行性分析的任務及報告”展開&#xff0c;詳細解析了可行性分析的基本概念、分析任務、四類可行性&#xff08;技術、經濟、操作、社會&#xff09;以及可行性分析報告的結構與撰寫要點。通過豐富的理論基礎與圖示支持&#xff0c;幫…

STM32與樹莓派通信

STM32 與樹莓派&#xff08;Raspberry Pi&#xff09;的通信常見方案及實現步驟&#xff1a;1. UART 串口通信&#xff08;最簡單&#xff09;適用場景&#xff1a;短距離、低速數據交換&#xff08;如傳感器數據、調試信息&#xff09;。 硬件連接&#xff1a;STM32引腳樹莓派…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 數據持久化到Mysql

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解數據持久化到Mysql 視頻在線地址&#xff…

【Java EE】多線程-初階-Thread 類及常見方法

多線程-初階2. Thread 類及常??法2.1 Thread 的常?構造?法2.2 Thread 的?個常?屬性2.3 啟動?個線程 - start()2.4 中斷?個線程2.5 等待?個線程 - join()2.6 獲取當前線程引?2.7 休眠當前線程本節?標? 認識多線程? 掌握多線程程序的編寫? 掌握多線程的狀態? 掌握…

LVS技術知識詳解(知識點+相關實驗部署)

目錄 1.1 LVS簡介 1.2 LVS體系結構 1.3 LVS相關術語 1.4 LVS工作模式 1.5 LVS工作原理 1.6 LVS調度算法 2.LVS相關實驗部署 2.1 lvs軟件相關信息 2.1.1 ipsadm常見參數 2.1.2 試例 2.2 LVS部署NAT模式 2.2.1 實驗環境 2.2.2 實驗步驟 2.2.2.1 實驗基礎環境 2.2.…

芋道導入邏輯

一、代碼 PostMapping("/import")Operation(summary "導入用戶")Parameters({Parameter(name "file", description "Excel 文件", required true),Parameter(name "updateSupport", description "是否支持更新&a…

gradle7.6.1+springboot3.2.4創建微服務工程

目錄 一、創建主工程cloud-demo并刪除src目錄 二、創建子工程user-service/order-service 三、更改父工程build.gradle文件 四、子工程使用mybatis框架 五、子工程使用mybatis-plus框架 六、相關數據庫創建 七、最終目錄結構 一、創建主工程cloud-demo并刪除src目錄 二、…

電腦windows系統深度維護指南

&#x1f5a5;? 電腦系統全方位維護指南 預防故障 提升性能 延長壽命 &#x1f50d; 引言&#xff1a;為什么需要系統維護&#xff1f; 電腦如同汽車&#xff0c;定期保養可避免&#xff1a; ? 突發藍屏死機 ? 系統卡頓崩潰 ? 硬件過早損壞 ? 數據丟失風險 本指南提供…

字節內部流傳的數據分析手冊

之前2領導整理內部分享的&#xff0c;所以很多內部業務的分析&#xff0c;比如工作中怎么落地、怎么推進。(數據都是脫敏的哈) **里面的內容都偏應用&#xff0c;比如產品迭代怎么做數據評估、用戶增長靠什么指標拆解、AB實驗怎么設計、運營活動怎么閉環。**數據分析都是很實際…

Nginx Proxy Manager + LB + Openappsec + Web UI 構建下一代WAF

Nginx Proxy Manager + LB + Openappsec + Web UI部署 一、環境介紹 二、系統參數優化 三、安裝docker 四、創建docker網絡 五、創建測試容器 六、部署NPM和openappsec 1、下載docker-compose文件 2、拉取相關鏡像 3、web UI 獲取token 4、修改compose文件并安裝 七、登陸NPM配…

【React】npm install報錯npm : 無法加載文件 D:\APP\nodejs\npm.ps1,因為在此系統上禁止運行腳本。

使用vsCode打開react項目安裝依賴時報錯&#xff0c;把terminal打開的powershell改成command prompt即可

深入解析C#裝箱轉換:值類型如何“變身”為引用類型?

當你將 int i 賦值給 object oi 時&#xff0c; 看似簡單的操作背后&#xff0c;藏著一場精密的類型轉換革命&#xff01;&#x1f511; 一、核心概念&#xff1a;什么是裝箱&#xff1f; 裝箱&#xff08;Boxing&#xff09; 是C#中的一種隱式轉換機制&#xff0c;它將值類型&…

java list 與set 集合的迭代器在進行元素操作時出現數據混亂問題及原因

為什么 List 和 Set 迭代器刪除結果不同&#xff1f;1. List 和 Set 的本質差異List&#xff08;如 ArrayList&#xff09;&#xff1a;有序集合&#xff0c;元素按插入順序存儲&#xff0c;允許重復元素。迭代器遍歷時&#xff0c;元素按索引順序返回。刪除操作&#xff08;通…

大語言模型:人像攝影的“達芬奇轉世”?——從算法解析到光影重塑的智能攝影革命

導言在攝影術誕生之初&#xff0c;達芬奇或許無法想象&#xff0c;他對于光影、比例和解剖的嚴謹研究&#xff0c;會在數百年后以另一種形式重生。今天&#xff0c;當攝影師面對復雜的光線環境或苦苦尋找最佳構圖時&#xff0c;一位由代碼構筑的“光影軍師”正悄然降臨——大語…

Java——MyBatis從入門到精通:一站式學習指南

MyBatis從入門到精通&#xff1a;一站式學習指南 作為一款優秀的半自動ORM框架&#xff0c;MyBatis以其靈活的SQL控制和簡潔的配置方式&#xff0c;成為Java后端開發中持久層框架的首選。本文將從基礎概念到高級特性&#xff0c;全面講解MyBatis的使用方法&#xff0c;包含實用…