UE4-UListView上拉加载数据

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-3-3 21:10:03 | 显示全部楼层
监听上拉到顶事件

首先,在STableViewBase中新增函数
float STableViewBase::GetOverscrollAmount() const
{
   return Overscroll.GetOverscroll(GetTickSpaceGeometry());
}
在ListView中,实际控制是否能Overscroll的是AllowOverscroll== EAllowOverscroll::Yes。 Overscroll在Tick中根据当前STableViewBase的SpaceGeometry获取List在beginning/end的above/below滚动的距离,并且将该距离传递给SListPanel。
void STableViewBase::Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime )
{
    //...
    if (AllowOverscroll == EAllowOverscroll::Yes)
    {
        const float OverscrollAmount = Overscroll.GetOverscroll(GetTickSpaceGeometry());
        ItemsPanel->SetOverscrollAmount( OverscrollAmount );
    }
}
当上拉ListView到顶时,参数OverscrollAmount为负数。
然后,在UListViewBase的OnTouchEnded函数中获取GetOverscrollAmount()
TSharedRef<SWidget> UListViewBase::RebuildWidget()
{
    MyTableViewBase->OnTouchEndedEvent.BindLambda([this](FGeometry MyGeometry, const FPointerEvent& TouchEvent)
        {
                OnListViewTouchEndedEvent.Broadcast(MyGeometry, TouchEvent);

                const float ScrollAmount = MyTableViewBase->GetOverscrollAmount();
                if (ScrollAmount < SMALL_NUMBER)
                {
                    OnListPanelReachTop.Broadcast(ScrollAmount); //  DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnListPanelReachTop, float, ScrollAmount);
                }
        });
}
每次TouchEnd结束时判断当前的ScrollAmount是否小于0即可。
新增从顶部添加数据

void UListView::AddItemFromTop(UObject* Item)
{
   ListItems.Insert(Item, 0);
   TArray<UObject*> Added;
   TArray<UObject*> Removed;
   Added.Add(Item);
   OnItemsChanged(Added, Removed);

   RequestRefresh();
}
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表