[SerializeField] private LoopListView2 loopListView;
[SerializeField] private RectTransform rectScrollView;
[SerializeField] private RectTransform rectContent;
[SerializeField] private ContestItemUI myContestItemUI;
bool isLoopListInit = false;
float itemHeight = 209;//item高度
float padding = -8.48f;//间距
float top = 61;//上方填充高度
float downPosY;//响应高度
void RefreshContestItem()
{
int contestAIDataCount = ContestAIManager.Instance.ContestAIData.Count;
if (contestAIDataCount == 0)
{
return;
}
if (!isLoopListInit)
{
// +1 => 本人数据不存在于ContestAIData中,从本地加载
// +1 => Top留白
loopListView.InitListView(contestAIDataCount + 1 + 1, OnGetContestData);
isLoopListInit = true;
}
else
{
loopListView.RefreshAllShownItem();
}
//在LoopListView2中有SupportScorollBar属性,默认是关闭状态
//这个属性控制Content高度的更新,打开时才能定位Content的总高度,遇到计算悬浮窗高度时一定要打开这个属性,不然这个Contest的Size会一直更新
//下面这段是将所有的List高度都计算一遍这样Contest的高度才会准确,必须来这么一遍
for (int i = 0; i < contestAIDataCount + 2; i++)
{
loopListView.MovePanelToItemIndex(i, 0);
}
//默认居中显示指定item
loopListView.MovePanelToItemIndex(ContestAIManager.Instance.PlayerRank, itemHeight * 2.5f);
//计算总Content的高度
float contentHeight = itemHeight * (contestAIDataCount + 1) + padding * contestAIDataCount + top;
//设置Content的高度,必须要打开SupportScorollBar的属性
loopListView.ScrollRect.content.sizeDelta = new Vector2(loopListView.ScrollRect.content.sizeDelta.x, contentHeight);
//计算目标Item的高度
float posY = top + (ContestAIManager.Instance.PlayerRank - 1) * itemHeight + (ContestAIManager.Instance.PlayerRank - 2) * padding;
//计算目标Item出现在Content矩形框最下方的高度,也就是响应高度
//相应高度 = 总高度-(总高度-目标item高度+矩形高度)
downPosY = rectContent.anchoredPosition.y - (rectContent.anchoredPosition.y - posY + rectScrollView.rect.size.y);
loopListView.ScrollRect.onValueChanged.RemoveAllListeners();
loopListView.ScrollRect.onValueChanged.AddListener((Vector2 pos) => { RefreshSelectItemState(pos.y); });
}
private void RefreshSelectItemState(float curY)
{
myContestItemUI.gameObject.SetActive(rectContent.anchoredPosition.y < downPosY);
}
private LoopListViewItem2 OnGetContestData(LoopListView2 listView, int index)
{
if (index < 0)
{
return null;
}
if (index == 0)
{
return listView.NewListViewItem("Top");
}
var datas = ContestAIManager.Instance.ContestAIData;
LoopListViewItem2 item = listView.NewListViewItem("ContestItem");
ContestItemUI itemUI = item.GetComponent<ContestItemUI>();
if (itemUI == null)
{
return null;
}
if (ContestAIManager.Instance.PlayerRank == index)
{
//玩家
itemUI.SetContestItemData(ContestAIManager.Instance.PlayerData, index);
myContestItemUI.SetContestItemData(ContestAIManager.Instance.PlayerData, index);
return item;
}
if (index >= ContestAIManager.Instance.PlayerRank)
{
itemUI.SetContestItemData(datas[index - 2], index);
}
else
{
itemUI.SetContestItemData(datas[index - 1], index);
}
return item;
}