一、需求

  • 分页器需要包含:【上一页按钮】、【下一页按钮】、【当前页码 / 总页数】、【每页条数】、【总记录数】
  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;包含实用…