前言
因工作需要,又找不到合适的,学习成本又低的分页加载组件,自己封装一套,也提供给小伙伴们一同使用,如有任何可优化的地方,也烦请各位大佬友情提出,感恩的♥♥♥
效果展示:
Unity分页加载组件
功能说明:
1、UI框架已搭建,样式可自行编辑
2、底部按钮说明:首页,向左翻一页,向左翻一大页,页面按钮,向右翻一大页,向右翻页,最后一页,搜索框,跳转按钮
安装教程:
- 免费下载地址:请到【https://gitee.com/jacobkay/unity-ZPageloading】中下载
- 下载之后将两个文件夹直接拖入工程中
- 将“PageLoading/Prefabs/PagingLoad”预制体直接拖入到canvas下
- Inspector面板中即可看到所有显示配置项
- 点击运行,即可使用
- 内含使用demo脚本(PageLoadingDemo.cs),方便学习使用
- 内含Tab(单选框,复选框)组件,如需了解如何使用,请查看【Unity单选框,复选框免费下载,使用说明_JacobKay的博客-CSDN博客_unity单选框】
可配置显示项:
- Awake2Init: true => 分页加载运行即初始化,false => 运行时不会自动初始化,如有需要可自行调用接口进行初始化
- EveryPageRequest: true => 每一页都会请求接口进行数据刷新,false => 加载过的页面,再次查看不会重新请求数据
- Input2Page: true => 可打开输入页码进行跳转功能,false => 关闭输入页码跳转功能
- PageItemNum: 一页显示多少条内容
- PageBtnNum: 一次显示多少页可选择
- PageItemObj: 需要加载显示的对象(transform)
- PageBtnObj: 翻页按钮对象(gameobject)
API(PageLoading中)
继承PageLoading,实现抽象方法
1、GetPageDataEvent(抽象方法): 通过网络请求获取当前页面数据,可拿到当前页面页码,一共要请求多少条,最终调用回调方法,传入数据列表和数据总条数
2、SetPageItemEvent(抽象方法): 设置每一条数据对象显示内容,可拿到当前需要展示的对象,和展示的数据对象
3、CrtPageNum(属性): 可以手动获取当前选择的页码
4、CrtPageNum(属性):可手动获取当前当前日期
/// <summary>
/// 手动获取当前选择那页
/// </summary>
public int CrtPageNum { get; set; }
5、Init(方法):通过接口可初始化
/// <summary>
/// 初始化分页加载
/// </summary>
public void Init()
{
pageLoadingController.Init();
}
6、Jump2Page(方法): 跳到传进来的参数编号,即可翻到对应页面
/// <summary>
/// 跳到对应的页面
/// </summary>
public void Jump2Page(int page)
{
pageLoadingController.Click2Page(page);
}
整体思路:
将初始化,内容更新,底部按钮状态变化,分模块编写,发生按钮点击时分模块调用,易于维护
附管理器代码
using System.Collections.Generic;
using UnityEngine;
namespace ZTools
{
public class PageLoadingController
{
public PageLoadingModel pageLoadingModel;
public PageLoading pageLoadingView;
/// <summary>
/// 记录每一页的信息
/// </summary>
private Dictionary<int, List<object>> pageItemDic = new Dictionary<int, List<object>>();
/// <summary>
/// 存放当前按钮列表
/// </summary>
private List<PageLoadingPageBtn> pageBtnList = new List<PageLoadingPageBtn>();
private int startPage;
private int indexPage;
private int allPage;
private bool isLoading = false;
private int allItemNum = 0;
public bool isInit = false;
int maxStartPageNum = 0;
/// <summary>
/// 初始化数据
/// </summary>
public void Init()
{
startPage = 1;
indexPage = 1;
allItemNum = 0;
maxStartPageNum = 0;
pageItemDic.Clear();
pageBtnList.Clear();
pageLoadingModel.DestroyContentChild();
pageLoadingModel.DestroyBtnContentChild();
allPage = 0;
UpdateData();
}
/// <summary>
/// 显示列表,每次点击都需要调用
/// </summary>
void UpdateData()
{
if (isLoading) return;
if (!pageItemDic.ContainsKey(indexPage) || pageLoadingModel.everyPageRequest)
{
if (pageItemDic.ContainsKey(indexPage))
{
pageItemDic[indexPage].Clear();
pageItemDic.Remove(indexPage);
}
isLoading = true;
pageLoadingView.GetData(indexPage, pageLoadingModel.pageItemNum, (List<object> dataList, int count) =>
{
AddDataList(indexPage, dataList, count);
});
}
else
{
AddDataList(indexPage, pageItemDic[indexPage], allItemNum);
}
}
/// <summary>
/// 更新页面内容
/// </summary>
/// <param name="iPage">当前页面</param>
/// <param name="pageDataList">该页显示内容列表</param>
/// <param name="totalList">总条数</param>
void AddDataList(int iPage, List<object> pageDataList, int totalList)
{
if (!pageItemDic.ContainsKey(iPage))
{
pageItemDic.Add(iPage, pageDataList);
}
// 初始化数据
if (!isInit)
{
allItemNum = totalList;
AddPageBtn();
InitEvent();
isInit = true;
}
UpdatePageBtnShowType();
UpdatePageBtnChoiceType();
UpdatePageItemList();
// 加载结束
isLoading = false;
}
/// <summary>
/// 初始化底部按钮状态
/// </summary>
void AddPageBtn()
{
if (pageLoadingModel.pageItemNum != 0 && pageLoadingModel.pageBtnNum != 0)
{
allPage = (int)Mathf.Ceil(allItemNum / pageLoadingModel.pageItemNum);
allPage = allPage == 0 ? 1 : allPage;
maxStartPageNum = allPage < pageLoadingModel.pageBtnNum ? 1 : allPage - pageLoadingModel.pageBtnNum + 1;
pageLoadingModel.AllPageTxt = allPage.ToString();
float instAllPage = (allPage > pageLoadingModel.pageBtnNum) ? pageLoadingModel.pageBtnNum : allPage;
for (int i = 0; i < instAllPage; i++)
{
PageLoadingPageBtn pageBtn = pageLoadingModel.AddBtnObj();
pageBtn.prtObj = this;
pageBtnList.Add(pageBtn);
}
}
}
/// <summary>
/// 初始化点击绑定事件
/// </summary>
void InitEvent()
{
if (pageLoadingModel.btnLeft != null)
pageLoadingModel.btnLeft.onClick.AddListener(LeftClick);
if (pageLoadingModel.btnRight != null)
pageLoadingModel.btnRight.onClick.AddListener(RightClick);
if (pageLoadingModel.btnPageLeft != null)
pageLoadingModel.btnPageLeft.onClick.AddListener(BtnPageLeft);
if (pageLoadingModel.btnPageRight != null)
pageLoadingModel.btnPageRight.onClick.AddListener(BtnPageRight);
if (pageLoadingModel.btnAllPage != null)
pageLoadingModel.btnAllPage.onClick.AddListener(AllPage);
if (pageLoadingModel.btnFirstPage != null)
pageLoadingModel.btnFirstPage.onClick.AddListener(FirstPage);
}
/// <summary>
/// 点击向左翻页按钮
/// </summary>
void LeftClick()
{
if (!isLoading)
{
indexPage--;
if (indexPage < startPage)
{
startPage--;
}
UpdateData();
}
}
/// <summary>
/// 点击向右翻页按钮
/// </summary>
void RightClick()
{
if (!isLoading)
{
indexPage++;
if (indexPage > pageLoadingModel.pageBtnNum && startPage + pageLoadingModel.pageBtnNum - 1 < allPage)
{
startPage++;
}
UpdateData();
}
}
/// <summary>
/// 点击向左大翻页按钮
/// </summary>
void BtnPageLeft()
{
if (!isLoading)
{
startPage -= pageLoadingModel.pageBtnNum;
indexPage -= pageLoadingModel.pageBtnNum;
if (startPage < 1)
{
indexPage += (1 - startPage);
startPage = 1;
}
UpdateData();
}
}
/// <summary>
/// 点击向右大翻页按钮
/// </summary>
void BtnPageRight()
{
if (!isLoading)
{
startPage += pageLoadingModel.pageBtnNum;
indexPage += pageLoadingModel.pageBtnNum;
int lastPage = allPage - pageLoadingModel.pageBtnNum + 1;
if (startPage > lastPage)
{
indexPage -= (startPage - lastPage);
startPage = lastPage;
}
UpdateData();
}
}
/// <summary>
/// 点击首页
/// </summary>
void FirstPage()
{
if (!isLoading)
{
indexPage = 1;
startPage = 1;
UpdateData();
}
}
/// <summary>
/// 点击尾页
/// </summary>
void AllPage()
{
if (!isLoading)
{
indexPage = allPage;
startPage = (allPage > pageLoadingModel.pageBtnNum) ? allPage - pageLoadingModel.pageBtnNum + 1 : 1;
UpdateData();
}
}
/// <summary>
/// 翻页时,清空当前显示内容
/// </summary>
void UpdatePageItemList()
{
pageLoadingModel.DestroyContentChild();
for (int i = 0; i < pageItemDic[indexPage].Count; i++)
{
Transform item = pageLoadingModel.AddItemObj();
pageLoadingView.SetItem(item, pageItemDic[indexPage][i], i + 1);
}
}
/// <summary>
/// 更新按钮显示状态及内容
/// </summary>
void UpdatePageBtnShowType()
{
pageLoadingView.ChangePageNum(indexPage);
if (pageBtnList[0].PageIndex != startPage)
{
for (int i = 0; i < pageBtnList.Count; i++)
{
pageBtnList[i].PageIndex = startPage + i;
}
}
if (allPage > pageLoadingModel.pageBtnNum)
{
pageLoadingModel.btnPageLeft.interactable = pageBtnList[0].PageIndex != 1;
pageLoadingModel.btnPageRight.interactable = pageBtnList[pageBtnList.Count - 1].PageIndex != allPage;
}
else
{
pageLoadingModel.btnPageLeft.interactable = false;
pageLoadingModel.btnPageRight.interactable = false;
}
pageLoadingModel.btnRight.interactable = (indexPage != allPage);
pageLoadingModel.btnLeft.interactable = (indexPage != 1);
}
/// <summary>
/// 更新页码按钮显示状态
/// </summary>
void UpdatePageBtnChoiceType()
{
if (pageLoadingModel.pageBtnNum > 0)
{
for (int i = 0; i < pageBtnList.Count; i++)
{
pageBtnList[i].ChangeChoiceType(indexPage);
}
}
else
{
Debug.LogError("最少显示页数不能为0");
}
}
/// <summary>
/// 点击翻页按钮后,对应跳到相应页面
/// </summary>
/// <param name="page"></param>
public void Click2Page(int page)
{
if (page < 1 || page > allPage) return;
if (allPage > pageLoadingModel.pageBtnNum && (page > startPage + pageLoadingModel.pageBtnNum - 1 || page < startPage))
{
startPage = GetStartPage(page);
}
indexPage = page;
UpdateData();
}
/// <summary>
/// 设置起始页
/// </summary>
int GetStartPage(int num)
{
return num > maxStartPageNum ? maxStartPageNum : num;
}
}
}
更多好用插件会陆续更新,如有插件优化,或者更多好推荐,烦请大佬们友情指出
更多好用Unity插件请见【JacobKay的博客_CSDN博客-领域博主】查看
感谢观看~~~~