需要使用到循环列表:SuperScrollView.LoopListView2
UI界面代码:
using SuperScrollView;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIDate : MonoBehaviour
{
public SuperScrollView.LoopListView2 YearLoopList;
public SuperScrollView.LoopListView2 MonthLoopList;
public SuperScrollView.LoopListView2 DayLoopList;
public Button BtnLog;
public Text TextDate;
private string mCurYear = "";
private string mCurMonth = "";
private string mCurDay = "";
// Start is called before the first frame update
void Start()
{
InitAllYear();
InitAllMonth();
InitAllDay();
BtnLog.onClick.AddListener(OnClickBtnLog);
}
private void OnClickBtnLog()
{
TextDate.text = $"{mCurYear}{mCurMonth}{mCurDay}";
}
#region 年
private List<string> mAllYearList = new();
private void InitAllYear()
{
int currentYear = System.DateTime.Now.Year;
mAllYearList = new();
mAllYearList.Add("");
mAllYearList.Add("");
for (int i = 0; i < 50; i++)
{
mAllYearList.Add($"{currentYear - i}年");
}
mCurYear = YearLoopList.ArrangeType switch
{
ListItemArrangeType.BottomToTop or ListItemArrangeType.RightToLeft => mAllYearList[^1],
ListItemArrangeType.TopToBottom or ListItemArrangeType.LeftToRight => mAllYearList[0],
_ => mCurYear
};
mAllYearList.Add("");
mAllYearList.Add("");
//默认值为第三个数
mCurYear = mAllYearList[2];
YearLoopList.InitListView(mAllYearList.Count, OnGetYearItemByIndex);
YearLoopList.mOnSnapNearestChanged = OnYearSnapTargetChanged;
}
private void OnYearSnapTargetChanged(LoopListView2 listView, LoopListViewItem2 item)
{
int index = listView.GetIndexInShownItemList(item);
if (index < 0)
{
return;
}
UIDate_DateItem itemScript = item.GetComponent<UIDate_DateItem>();
if (!string.IsNullOrEmpty(mAllYearList[itemScript.mIndex]))
{
mCurYear = mAllYearList[itemScript.mIndex];
}
RefreshDay();
}
private LoopListViewItem2 OnGetYearItemByIndex(LoopListView2 listView, int index)
{
if (index < 0 || mAllYearList.Count == 0 || index >= mAllYearList.Count)
return null;
LoopListViewItem2 item = listView.NewListViewItem("DateItem");
UIDate_DateItem script = item.GetComponent<UIDate_DateItem>();
script.SetData(mAllYearList[index].ToString(), index);
return item;
}
#endregion
#region 月
private List<string> mAllMonthList = new();
private void InitAllMonth()
{
mAllMonthList = new();
mAllMonthList.Add("");
mAllMonthList.Add("");
for (int i = 1; i <= 12; i++)
{
mAllMonthList.Add($"{i:D2}月");
}
mAllMonthList.Add("");
mAllMonthList.Add("");
//默认值为第三个数
mCurMonth = mAllMonthList[2];
MonthLoopList.InitListView(mAllMonthList.Count, OnGetMonthItemByIndex);
MonthLoopList.mOnSnapNearestChanged = OnMonthSnapTargetChanged;
}
private void OnMonthSnapTargetChanged(LoopListView2 listView, LoopListViewItem2 item)
{
int index = listView.GetIndexInShownItemList(item);
if (index < 0)
{
return;
}
UIDate_DateItem itemScript = item.GetComponent<UIDate_DateItem>();
if (!string.IsNullOrEmpty(mAllMonthList[itemScript.mIndex]))
{
mCurMonth = mAllMonthList[itemScript.mIndex];
}
RefreshDay();
}
private LoopListViewItem2 OnGetMonthItemByIndex(LoopListView2 listView, int index)
{
if (index < 0 || mAllMonthList.Count == 0 || index >= mAllMonthList.Count)
return null;
LoopListViewItem2 item = listView.NewListViewItem("DateItem");
UIDate_DateItem script = item.GetComponent<UIDate_DateItem>();
script.SetData(mAllMonthList[index].ToString(), index);
return item;
}
#endregion
#region 日
private List<string> mAllDayList = new();
private void InitAllDay()
{
mAllDayList = new();
mAllDayList.Add("");
mAllDayList.Add("");
for (int i = 1; i <= 30; i++)
{
mAllDayList.Add($"{i:D2}日");
}
mAllDayList.Add("");
mAllDayList.Add("");
//默认值为第三个数
mCurDay = mAllDayList[2];
DayLoopList.InitListView(mAllDayList.Count, OnGetDayItemByIndex);
DayLoopList.mOnSnapNearestChanged = OnDaySnapTargetChanged;
}
private void RefreshDay()
{
int daysInMonth = 30;
if (!string.IsNullOrEmpty(mCurYear) && !string.IsNullOrEmpty(mCurMonth))
{
int year = int.Parse(mCurYear.Replace("年", ""));
int month = int.Parse(mCurMonth.Replace("月", ""));
daysInMonth = DateTime.DaysInMonth(year, month);
}
mAllDayList = new();
mAllDayList.Add("");
mAllDayList.Add("");
for (int i = 1; i <= daysInMonth; i++)
{
mAllDayList.Add($"{i:D2}日");
}
mAllDayList.Add("");
mAllDayList.Add("");
//默认值为第三个数
mCurDay = mAllDayList[2];
DayLoopList.SetListItemCount(mAllDayList.Count);
DayLoopList.RefreshAllShownItem();
}
private void OnDaySnapTargetChanged(LoopListView2 listView, LoopListViewItem2 item)
{
int index = listView.GetIndexInShownItemList(item);
if (index < 0)
{
return;
}
UIDate_DateItem itemScript = item.GetComponent<UIDate_DateItem>();
if (!string.IsNullOrEmpty(mAllDayList[itemScript.mIndex]))
{
mCurDay = mAllDayList[itemScript.mIndex];
}
}
private LoopListViewItem2 OnGetDayItemByIndex(LoopListView2 listView, int index)
{
if (index < 0 || mAllDayList.Count == 0 || index >= mAllDayList.Count)
return null;
LoopListViewItem2 item = listView.NewListViewItem("DateItem");
UIDate_DateItem script = item.GetComponent<UIDate_DateItem>();
script.SetData(mAllDayList[index].ToString(), index);
return item;
}
#endregion
}
Item代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIDate_DateItem : MonoBehaviour
{
public Text TextContent;
public int mIndex;
void Start()
{
// Code Here
}
public void SetData(string content, int index)
{
TextContent.text = content;
mIndex = index;
}
}
界面设置:

效果展示:

1490

被折叠的 条评论
为什么被折叠?



