【Unity3D实现无限循环列表分页显示效果】

Unity3D实现无限循环列表分页显示效果

一、简单介绍

本文简单展示基于unity实现列表翻页显示。为避免数据过多造成资源浪费,采用循环使用列表项方法节省CPU和内存资源。列表实现采用预制体实例化遍历数据方法可见我之前文章。

Unity-----列表功能实现(数据读取.CSV文件)

效果展示图

在这里插入图片描述
在这里插入图片描述

二、关键代码

数据库内读取数据,列表显示。

using MySql.Data.MySqlClient;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class PageSwitch : MonoBehaviour
{
    public static PageSwitch _instance;
    //调用数据库
    DataBase mysqldata = new DataBase();
    //存放数据字典
    //public Dictionary<int, Info> _InfoData = new Dictionary<int, Info>();    
    /// <summary>
    /// 存放数据List
    /// </summary>
    public List<Info> _infoSaveList;    
    /// <summary>
    /// 元素gameobject
    /// </summary>
    public GameObject[] info_;
    /// <summary>
    /// 当前页面索引
    /// </summary>
    private int pageIndex = 1;

    /// <summary>
    /// 总页数
    /// </summary>
    private int pageCount = 0;

    /// <summary>
    /// 元素总个数
    /// </summary>
    private int itemCount = 0;

    public Text CurrentPage;

    public Text PageCount;
    /// <summary>
    /// 设置每页元素数量
    /// </summary>
    private int PageItemCount = 10;
    /// <summary>
    /// 元素生成位置
    /// </summary>
    private Transform UICanvas;
    /// <summary>
    /// 当前页元素个数
    /// </summary>
    private int CurrentPageItemCount = 0;
    // Use this for initialization
    //private void Awake()
    //{
    //    UICanvas = GameObject.Find("Canvas/ItemParent").transform;
    //}
    void Start()
    {
      
        _instance = this;

        _infoSaveList = new List<Info>();

        InitInfo();

        PageCount.text = pageCount.ToString();

    }


    void Update()
    {
        CurrentPage.text = pageIndex.ToString();
    }
    /// <summary>
    /// 初始化
    /// 条件表达式三元运算符:如x>y?a:b,即当x>y时表达式取值a,否则取值b;
    /// </summary>
    void InitInfo()
    {
        //数据库查询
        mysqldata.Select("user");
      
        itemCount = _infoSaveList.Count;       
        
        //页码数
        pageCount = _infoSaveList.Count % PageItemCount == 0 ? _infoSaveList.Count / PageItemCount : _infoSaveList.Count / PageItemCount + 1;
        BindPage(pageIndex);
       
    }

    void BindPage(int index)
    {       
       
        if (pageCount == 1)
        {
           
            int Item = 0;
            for (int i = itemCount; i > 0; i--)
            {               
                if (Item < itemCount)
                {
                    //字典
                    //BindItem(info_[canDisPlay].transform, _InfoData[itemCount + 1 - i]);
                    //List
                    BindItem(info_[Item].transform, _infoSaveList[itemCount - i]);
                    info_[Item].gameObject.SetActive(true);                   
                }
                else
                {
                    info_[Item].gameObject.SetActive(false);                   
                }

                Item++;
            }
        }
        else if (pageCount > 1)
        {           
            if (index == pageCount)
            {
                int Item = 0;
                for (int i = PageItemCount; i > 0; i--)
                {
                    if (Item < itemCount - PageItemCount * (index - 1))
                    {
                        //字典
                        //BindItem(info_[candisplay].transform, _InfoData[PageItemCount * index - i + 1]);
                        //List
                        BindItem(info_[Item].transform, _infoSaveList[itemCount - i]);
                        info_[Item].gameObject.SetActive(true);
                    }
                    else
                    {
                        info_[Item].gameObject.SetActive(false);
                    }

                    Item++;

                }
            }
            else
            {                         
                for (int i = PageItemCount; i > 0; i--)
                {
                    //字典
                    //BindItem(info_[PageItemCount - i].transform, _InfoData[PageItemCount * index - i + 1]);
                    //List
                    BindItem(info_[PageItemCount - i].transform, _infoSaveList[PageItemCount * index - i]);
                    info_[PageItemCount - i].gameObject.SetActive(true);

                }
            }
        }

    }

    void BindItem(Transform tran, Info infos)
    {       
        tran.Find("name/Text").GetComponent<Text>().text = infos.name;
        tran.Find("psd/Text").GetComponent<Text>().text = infos.password.ToString();
    }

    public void PreClick()
    {
        if (pageCount <= 0)
            return;
        //第一页时禁止向前翻页
        if (pageIndex <= 1)
            return;     
        
        pageIndex -= 1;
        if (pageIndex < 1)
            pageIndex = 1;
        
        BindPage(pageIndex);
    }
    /// <summary>
    /// 首页
    /// </summary>
    public void FirstPage()
    {
        pageIndex = 1;
        BindPage(pageIndex);
    }
    /// <summary>
    /// 尾页
    /// </summary>
    public void LastPage()
    {
        pageIndex = pageCount;
        BindPage(pageIndex);
    }
    public void NextClick()
    {
        if (pageCount <= 0)
            return;
        //最后一页禁止向后翻页
        if (pageIndex >= pageCount)
            return;
      
        pageIndex += 1;
        if (pageIndex >= pageCount)
            pageIndex = pageCount;       
        
        BindPage(pageIndex);
    }
}
public class DataBase
{
    /// <summary>
    /// 查询表内所有字段
    /// </summary>
    /// <param 表名="tableName"></param>
    public void Select(string tableName)
    {
        string sqlSer = "server =" + Info.Instance._DatabaseIP + ";" + " port=" + Info.Instance._DatabasePort + ";" + " database =" + Info.Instance.Database + ";" + "user =" + Info.Instance._DatabaseUser + ";" + "password =" + Info.Instance._DatabasePassword + ";";
        //Debug.Log(sqlSer);
        MySqlConnection con = new MySqlConnection(sqlSer);
        try
        {
            con.Open();
            string sqlSelect = "select * from " + tableName;           
            //Debug.Log(sqlSelect);
            MySqlCommand comd = new MySqlCommand(sqlSelect, con);
            int resule = comd.ExecuteNonQuery();
            comd.Dispose();
            MySqlDataReader reader = comd.ExecuteReader();
            while (reader.Read())
            {
                Info data = new Info
                {
                    //id = reader.GetInt32("id"),
                    name = reader.GetString("username"),
                    password = reader.GetString("password"),
                };                
                //PageSwitch._instance._InfoData.Add(data.id, data);
                PageSwitch._instance._infoSaveList.Add(data);

            }
        }
        catch (Exception e)
        {
            Debug.Log(e.Message);
        }
        finally
        {
            con.Close();
        }
    }
}
public class Info
{
    private static Info _instance;
    public static Info Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new Info();
            }
            return _instance;
        }
    }
    public int id { get; set; }
    public string name { get; set; }
  
    public string password { get; set; }
    #region 数据库
    //数据库IP
    public string _DatabaseIP = "192.168.1.1";
    //端口号
    public string _DatabasePort = "3306";
    //数据库名称
    public string Database = "unity";
    //数据库账号
    public string _DatabaseUser = "root";
    //数据库密码
    public string _DatabasePassword = "******";
    #endregion
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值