Android仿前端分页组件pagination

仿前端pagination

Android仿前端分页组件pagination

最近Android原生有个需求就是做个分页组件,不用上拉加载,因为数据量太大用户喜欢前端的方式,UI主要是拼凑比较简单,主要补充了一些判断越界和数据不全的细节,记录方便以后COPY

适配器用的万能的

maven { url 'https://jitpack.io' }
  implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4"

使用示例

 

   //设置监听即可pageBottomView.mOnPageNumChangeListener = object : PageBottomView.OnPageChangeListener {override fun onPageChange(page: Int, mustRefresh: Boolean) {if (mustRefresh) {mViewModel.goodsPage = pageval name = etGoodsName.text.trim().toString()mViewModel.filterList(name)}}}  fun getGoodsList(goodsName: String? = null) {ApiClient.mainService().getGoodsList(page = goodsPage,page_size = goodsSize,fuzzySearch = goodsName,goodsCategoryId = selectDishType.goodsCategoryId).enqueue(object : BaseCallBack<GoodsPage>() {override fun success(response: HttpResult<GoodsPage>) {LogUtils.logD(TAG, "getGoodsTypeList:${response.data?.data?.size}")response.data?.run {
//                        if (current_page?.toInt() == 1) {
//
//                        }// 设置最大值 接口没有则可以不显示 或者用固定值binding.pageBottomView.setPageSize(last_page, total)// 因为是前端单页分页 所以都得清除// 主页面列表更换goodsList.clear()data?.run {goodsList.addAll(this)}goodsLiveData.postValue(goodsList)}}})}

PageBottomView 

package your pkgimport android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.viewholder.QuickViewHolder
import your R class PageBottomView : LinearLayout {var pageIndex = 1var pageMax = 10var pageMin = 3var pageMore = arrayListOf(3, 4, 5, 6, 7)constructor(context: Context) : super(context) {initView(context)}constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {initView(context)}constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr) {initView(context)}constructor(context: Context,attrs: AttributeSet?,defStyleAttr: Int,defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {initView(context)}//    var weightValue = 0.00f
//    var mEditText: EditText? = nullclass PageAdapter : BaseQuickAdapter<Int, QuickViewHolder>() {var mPage = 0override fun onCreateViewHolder(context: Context,parent: ViewGroup,viewType: Int): QuickViewHolder {return QuickViewHolder(R.layout.item_rv_page, parent)}override fun onBindViewHolder(holder: QuickViewHolder,position: Int,item: Int?) {item?.run {holder.setText(R.id.tvPage, "${item}")selectPage(holder.getView(R.id.tvPage), mPage == item)}}fun updatePageUI(page: Int) {mPage = pagenotifyDataSetChanged()}fun selectPage(textView: TextView, isSelect: Boolean) {if (isSelect) {textView.setBackgroundResource(R.drawable.shape_rect_bg_f2_blue_4)textView.setTextColor(Color.WHITE)} else {textView.setBackgroundResource(R.drawable.shape_rect_dialog_bg_line_4)textView.setTextColor(Color.parseColor("#FF333333"))}}}private val mPageAdapter = PageAdapter()var mOnPageNumChangeListener: OnPageChangeListener? = nullvar rvPage: RecyclerView? = nullvar tvMore: TextView? = nullvar tvPageLeftIndex: TextView? = nullvar tvPageRightIndex: TextView? = nullvar tvPageStart: TextView? = nullvar tvPageStart2: TextView? = nullvar tvPageEnd: TextView? = nullvar ivPageRuduce: ImageView? = nullvar ivPageAdd: ImageView? = nullvar tvGoPageEdit: TextView? = nullvar etPageNum: EditText? = nullvar tvTotal: TextView? = nullprivate fun initView(context: Context) {inflate(context, R.layout.view_page_index, this)rvPage = findViewById(R.id.rvPage)tvMore = findViewById(R.id.tvMore)tvPageLeftIndex = findViewById(R.id.tvPageLeftIndex)tvPageRightIndex = findViewById(R.id.tvPageRightIndex)tvPageStart = findViewById(R.id.tvPageStart)tvPageStart2 = findViewById(R.id.tvPageStart2)tvPageEnd = findViewById(R.id.tvPageEnd)ivPageRuduce = findViewById(R.id.ivPageRuduce)ivPageAdd = findViewById(R.id.ivPageAdd)tvGoPageEdit = findViewById(R.id.tvGoPageEdit)etPageNum = findViewById(R.id.etPageNum)tvTotal = findViewById(R.id.tvTotal)rvPage?.adapter = mPageAdapterrvPage?.setLayoutManager(LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL, false))tvMore?.setOnClickListener {if (rvPage?.visibility == View.GONE) {rvPage?.visibility = View.VISIBLEtvPageLeftIndex?.visibility = View.VISIBLEtvPageRightIndex?.visibility = View.VISIBLE} else {rvPage?.visibility = View.GONEtvPageLeftIndex?.visibility = View.GONEtvPageRightIndex?.visibility = View.GONE}}tvPageStart?.setOnClickListener {onPageChange(1, true)}tvPageStart2?.setOnClickListener {onPageChange(2, true)}tvPageStart?.setOnClickListener {onPageChange(1, true)}tvPageEnd?.setOnClickListener {onPageChange(pageMax, true)}ivPageRuduce?.setOnClickListener {reducePageOne()}ivPageAdd?.setOnClickListener {addPageOne()}tvPageLeftIndex?.setOnClickListener {reducePageNext()initData()}tvPageRightIndex?.setOnClickListener {addPageNext()initData()}mPageAdapter.setOnItemClickListener { adapter, view, position ->pageIndex = adapter.items[position]onPageChange(pageIndex, true)}tvGoPageEdit?.setOnClickListener {pageIndex = (etPageNum?.text?.trim() ?: "0").toString().toInt()if (pageIndex > pageMax) {pageIndex = pageMax}if (pageIndex < pageMin) {pageIndex = pageMin}etPageNum?.setText(pageIndex.toString())etPageNum?.clearFocus()pageMore.clear()var right = pageIndex + 4if (pageIndex + 4 > pageMax - 1) {right = pageMax - 1}if (right < 7) {right = 7}for (i in right - 4..right) {pageMore.add(i)}onPageChange(pageIndex, true)}// 初始化UIonPageChange(1, false)}fun setTotalText(des: String) {tvTotal?.text = des}private fun initData() {// fixme  5 为一段  不包含 1 2 10 逻辑待补充mPageAdapter.submitList(pageMore)onPageChange(pageIndex, true)}fun initDataFirst() {pageIndex = 1pageMore = arrayListOf(3, 4, 5, 6, 7)// fixme  5 为一段  不包含 1 2 10 逻辑待补充mPageAdapter.submitList(pageMore)onPageChange(pageIndex, true)}private fun reducePageOne() {pageIndex = if (pageIndex - 1 >= 1) {--pageIndex} else {1}if (pageIndex < pageMore[0] && pageMore[0] - 1 > 2) {// pageMore 每个数加1for (i in 0..4) {pageMore[i] = pageMore[i] - 1}}onPageChange(pageIndex, true)}private fun addPageNext() {if (pageMore[4] + 5 < pageMax) {for (i in 0..4) {pageMore[i] = pageMore[i] + 5}} else {for (i in 0..4) {pageMore[i] = (pageMax - 5) + i}}pageIndex = pageMore[2]onPageChange(pageIndex, true)}private fun reducePageNext() {if (pageMore[0] - 5 > 2) {for (i in 0..4) {pageMore[i] = pageMore[i] - 5}} else {for (i in 0..4) {pageMore[i] = i + pageMin}}pageIndex = pageMore[2]onPageChange(pageIndex, true)}private fun addPageOne() {pageIndex = if (pageIndex + 1 <= pageMax) {++pageIndex} else {pageMax}if (pageIndex > pageMore[4] && pageMore[4] + 1 < pageMax) {// pageMore 每个数加1for (i in 0..4) {pageMore[i] = pageMore[i] + 1}}onPageChange(pageIndex, true)}private fun onPageChange(page: Int, mustRefresh: Boolean) {pageIndex = pageif (pageIndex in 3..<pageMax) {rvPage?.visibility = View.VISIBLEtvPageLeftIndex?.visibility = View.VISIBLEtvPageRightIndex?.visibility = View.VISIBLEmPageAdapter.submitList(pageMore)}selectPage(tvPageStart, pageIndex == 1)selectPage(tvPageStart2, pageIndex == 2)selectPage(tvPageEnd, pageIndex == pageMax)mPageAdapter.updatePageUI(pageIndex)mOnPageNumChangeListener?.onPageChange(pageIndex, mustRefresh)}private fun selectPage(textView: TextView?, isSelect: Boolean) {textView?.run {if (isSelect) {setBackgroundResource(R.drawable.shape_rect_bg_f2_blue_4)setTextColor(Color.WHITE)} else {setBackgroundResource(R.drawable.shape_rect_dialog_bg_line_4)setTextColor(Color.parseColor("#FF333333"))}}}fun setPageSize(maxPage: Int, maxSize: Int) {pageMax = maxPageif (pageMax < 10) {pageMax = 10}// 操作maxtvPageEnd?.text = pageMax.toString()// 实际maxsetTotalText("共${maxPage}页 ${maxSize}条")}interface OnPageChangeListener {fun onPageChange(page: Int, mustRefresh: Boolean)}
}

view_page_index

<?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="wrap_content"android:gravity="center_vertical|end"android:orientation="horizontal"android:paddingHorizontal="@dimen/dp_90"android:paddingVertical="@dimen/dp_20"><TextViewandroid:id="@+id/tvTotal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:textColor="#FF333333"android:textSize="@dimen/dp_16"tools:text="共10页,100条数据" /><ImageViewandroid:id="@+id/ivPageRuduce"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_10"android:background="@drawable/shape_rect_dialog_bg_line_4"android:padding="@dimen/dp_5"android:src="@mipmap/icon_page_left" /><TextViewandroid:id="@+id/tvPageStart"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_12"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:text="1"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><TextViewandroid:id="@+id/tvPageStart2"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_6"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:text="2"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><TextViewandroid:id="@+id/tvPageLeftIndex"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_6"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:text="&lt;&lt;"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rvPage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginHorizontal="@dimen/dp_6"tools:listitem="@layout/item_rv_page" /><TextViewandroid:id="@+id/tvPageRightIndex"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_6"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:text="&gt;&gt;"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><TextViewandroid:id="@+id/tvMore"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_6"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:text="···"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><TextViewandroid:id="@+id/tvPageEnd"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_6"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:text="10"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><ImageViewandroid:id="@+id/ivPageAdd"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_12"android:background="@drawable/shape_rect_dialog_bg_line_4"android:padding="5dp"android:src="@mipmap/icon_page_right" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="@dimen/dp_6"android:gravity="center"android:text="28条/页"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="@dimen/dp_6"android:gravity="center"android:text="跳至"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><EditTextandroid:id="@+id/etPageNum"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_6"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:inputType="number"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="@dimen/dp_6"android:gravity="center"android:text="页"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /><TextViewandroid:id="@+id/tvGoPageEdit"android:layout_width="wrap_content"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_12"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:paddingHorizontal="@dimen/dp_20"android:text="跳转"android:textColor="#FF333333"android:textSize="@dimen/dp_18" />
</LinearLayout>

item_rv_page
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/tvPage"android:layout_width="@dimen/dp_28"android:layout_height="@dimen/dp_28"android:layout_marginStart="@dimen/dp_4"android:background="@drawable/shape_rect_dialog_bg_line_4"android:gravity="center"android:text="10"android:textColor="#FF333333"android:textSize="@dimen/dp_18" /></FrameLayout>

R.drawable.shape_rect_bg_f2_blue_4
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#FF2A82E4" /><cornersandroid:radius="4dp" />
</shape>

R.drawable.shape_rect_dialog_bg_line_4
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="@android:color/white" /><cornersandroid:radius="4dp" /><strokeandroid:width="0.5dp"android:color="#FFB0B0B0" />
</shape>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php:使用Ratchet类实现分布式websocket服务

一、前言 最近需要做一个有关聊天的小程序&#xff0c;逻辑很简单&#xff0c;所以不打算用Swoole和workerman之类的&#xff0c;最后选择了Ratchet&#xff0c;因为简单易用&#xff0c;适合小型websocket服务。 二、问题 但是目前我的项目是分布式环境&#xff0c;统一通过Ng…

贴代码框架PasteForm特性介绍之query,linkquery

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

深入理解下oracle 11g block组成

深层次说&#xff0c;oracle数据库的最少组成单位应该是块&#xff0c;一般默认情况下&#xff0c;oracle数据库的块大小是8kb&#xff0c;其中存储着我们平常所需的数据。我们在使用过程中&#xff0c;难免会疑问道&#xff1a;“oracle数据块中到底是怎样组成的&#xff0c;平…

万有引力定律和库仑定律:自然的对称诗篇

万有引力定律和库仑定律&#xff1a;自然的对称诗篇 在宇宙深邃的知识长河中&#xff0c;万有引力定律和库仑定律恰似两颗璀璨的明珠&#xff0c;闪耀着人类智慧与自然奥秘的光辉。 十七世纪&#xff0c;牛顿在对天体运行的深邃思索中&#xff0c;拨开重重迷雾&#xff0c;发现…

win10局域网加密共享设置

1、创建共享账户 我的电脑右键选择管理 选择本地用户和组 -> 用户 双击用户 在空白区域右键,新建用户 然后创建用户 点击创建后 2、设置网络 右下角网络右键

leetcode 50个简单和中等难度的题

简单难度题目&#xff08;25个&#xff09; ‌两数之和 (Two Sum)‌‌有效的括号 (Valid Parentheses)‌‌罗马数字转整数 (Roman to Integer)‌‌最长公共前缀 (Longest Common Prefix)‌‌合并两个有序链表 (Merge Two Sorted Lists)‌‌移除链表元素 (Remove Linked List E…

iic协议

IIC&#xff08;Inter-Integrated Circuit&#xff09;协议&#xff0c;也被称为I2C协议&#xff0c;是一种由荷兰的PHILIPS公司&#xff08;现为NXP半导体公司&#xff09;开发的简单、高效的通信协议。以下是关于IIC协议的详细介绍&#xff1a; 一、IIC协议概述 定义&#…

.NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】

一、使用VSCode开发.NET项目 1、创建文件夹&#xff0c;使用VSCode打开 2、安装扩展工具 1>C# 2>安装NuGet包管理工具&#xff0c;外部dll包依靠它来加载 法1》&#xff1a;NuGet Gallery&#xff0c;注意要启动科学的工具 法2》NuGet Package Manager GUl&#xff0c…

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策&#xff0c;并确认所做的优化是否产生预期结果。 默认情况下&#xff0c;性能分析器记录并保留游戏的最后 300 帧&a…

【LeetCode面试150】——219存在重复元素

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

运维面试题.云计算面试题之四.K8S

常见的k8s运维面试题 1、简述ETCD及其特点? etcd是一个用于配置共享和服务发现的键值存储系统,能够为整个分布式集群存储关键数据,协助集群正常运转 服务端将配置信息存储在etcd中,客户端从etcd中得到配置信息,etcd监听配置信息的变化,发现配置变化通知到客户端 特点 - 安…

【强化学习的数学原理】第03课-贝尔曼最优公式-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、例子&#xff1a;如何改进策略&#xff1f;二、最优策略和公式推导三、公式求解以及最优性四、最优策略的有趣性质五、本节课…

24小时自动监控,自动录制直播蓝光视频!支持抖音等热门直播软件

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工具特点📒📝 使用🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于许多直播爱好者和内容创作者而言,错过心爱的直播或难以搜集视频素材始终是一个难题。今天,给大家分享的这款工具可以轻松解决这个问题,它拥有…

【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感

本文将介绍如何使用LSTM训练一个能够创作诗歌的模型。为了训练出效果优秀的模型&#xff0c;我整理了来自网络的4万首诗歌数据集。我们的模型可以直接使用预先训练好的参数&#xff0c;这意味着您无需从头开始训练&#xff0c;即可在自己的电脑上体验AI作诗的乐趣。我已经为您准…

【Swift】运算符

文章目录 术语赋值运算符算数运算符基本四则算术运算符求余运算符一元负号运算符一元正号运算符 比较运算符三元运算符空合运算符区间运算符闭区间运算符半开区间运算符单侧区间运算符 逻辑运算符逻辑非运算符逻辑与运算符逻辑或运算符逻辑运算符组合计算 位运算符运算符优先级…

微信小程序技术架构图

一、视图层1.WXML&#xff08;WeiXin Markup Language&#xff09; 这是微信小程序的标记语言&#xff0c;类似于 HTML。它用于构建小程序的页面结构。例如&#xff0c;通过标签来定义各种视图元素&#xff0c;如<view>&#xff08;类似于 HTML 中的<div>&#xff…

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像&#xff1a;通过双像素可以实现&#xff1a;深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上&#xff0c;也有遮罩等方式的pd生成&#xff0c;如图双像素视图可以看到光圈的不同一半&#x…

#Verilog HDL# Verilog中的UDP原语

目录 一 UDP符号 1.1 组合UDP 1.2 时序UDP 1.2.1 电平UDP 1.2.2 边沿UDP 标准的Verilog原语,如nand和not,有时可能不足以或不便用于表示复杂逻辑。为了建模组合逻辑或时序逻辑,可以定义称为用户定义原语(UDP)的新原语元素。 所有UDP都有且仅有一个输出,该输出可以是…

Python 版本的 2024详细代码

2048游戏的Python实现 概述&#xff1a; 2048是一款流行的单人益智游戏&#xff0c;玩家通过滑动数字瓷砖来合并相同的数字&#xff0c;目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能&#xff0c;包括游戏逻辑、界面绘制和用户交互。 主…

socket连接封装

效果&#xff1a; class websocketMessage {constructor(params) {this.params params; // 传入的参数this.socket null;this.lockReconnect false; // 重连的锁this.socketTimer null; // 心跳this.lockTimer null; // 重连this.timeout 3000; // 发送消息this.callbac…