Unity分页加载组件免费下载,带输入跳转功能,使用说明

前言

因工作需要,又找不到合适的,学习成本又低的分页加载组件,自己封装一套,也提供给小伙伴们一同使用,如有任何可优化的地方,也烦请各位大佬友情提出,感恩的♥♥♥

效果展示:

Unity分页加载组件

功能说明:

1、UI框架已搭建,样式可自行编辑

2、底部按钮说明:首页,向左翻一页,向左翻一大页,页面按钮,向右翻一大页,向右翻页,最后一页,搜索框,跳转按钮

安装教程:

  1.  免费下载地址:请到【https://gitee.com/jacobkay/unity-ZPageloading】中下载
  2. 下载之后将两个文件夹直接拖入工程中
  3. 将“PageLoading/Prefabs/PagingLoad”预制体直接拖入到canvas下
  4. Inspector面板中即可看到所有显示配置项
  5. 点击运行,即可使用
  6. 内含使用demo脚本(PageLoadingDemo.cs),方便学习使用
  7. 内含Tab(单选框,复选框)组件,如需了解如何使用,请查看【Unity单选框,复选框免费下载,使用说明_JacobKay的博客-CSDN博客_unity单选框

可配置显示项:

  1. Awake2Init: true => 分页加载运行即初始化,false => 运行时不会自动初始化,如有需要可自行调用接口进行初始化
  2. EveryPageRequest: true => 每一页都会请求接口进行数据刷新,false => 加载过的页面,再次查看不会重新请求数据
  3. Input2Page: true => 可打开输入页码进行跳转功能,false => 关闭输入页码跳转功能
  4. PageItemNum: 一页显示多少条内容
  5. PageBtnNum: 一次显示多少页可选择
  6. PageItemObj: 需要加载显示的对象(transform)
  7. 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博客-领域博主】查看

感谢观看~~~~

猜你喜欢

转载自blog.csdn.net/qq_33161296/article/details/126742259