现状
我制作了一个xamarin表单跨平台应用程序,它有一个带有无限滚动listView的标签页。 每当最后一项出现时,listView将以10个项目的增量填充。
正常行为
通常当我们第一次点击标签页的顶部栏(包含标签页的标题栏)时(如果我们当时没有查看标签),应用程序将切换到查看那个页面。哪个没问题。
当我们第二次点击顶部栏时(点击当前查看标签页的顶栏时),没有任何反应(与推特不同,你可以点击滚动到顶部)
我的问题
我希望能够让listView滚动到顶部(到列表中的第一个项目),当点击顶部栏时(类似于Twitter在其Android应用程序中的作用),同时仍然保持所有已经我的listView中加载了项目。
有关如何使顶部栏对水龙头做出反应以将listView滚动回顶部的想法吗?
答案 0 :(得分:0)
你应该尝试这样的东西来向上滚动
ListViewName.ScrollTo(yourobject,ScrollToPosition.Start, true);
// true means boolean for animated.
我希望这可以帮到你
答案 1 :(得分:0)
TabbedPage公开了一个CurrentPageChanged事件(或者您可以覆盖OnCurrentPageChanged),该事件仅在所选选项卡发生更改时触发,因此如果您想在用户更改选项卡时滚动,则需要订阅该事件。看起来似乎并不需要,但以防万一...
Xamarin.Forms没有内置事件,当第二次选择已经选择的选项卡时会触发该事件。您可以通过子类化Xamarin的TabbedPage渲染器,使用自定义渲染器实现这一点。我写了here并为iOS,Android和UWP here提供了一个有效的Xamarin.Forms解决方案。
你没有提到这些平台,所以假设你想要iOS和Android,核心位在下面。
iOS自定义渲染器
public class MainTabPageRenderer : TabbedRenderer
{
private UIKit.UITabBarItem _prevItem;
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
if (SelectedIndex < TabBar.Items.Length)
_prevItem = TabBar.Items[SelectedIndex];
}
public override void ItemSelected(UIKit.UITabBar tabbar,
UIKit.UITabBarItem item)
{
if (_prevItem == item && Element is MainPage)
{
// the same tab was selected a second time, so do something
}
_prevItem = item;
}
}
Android自定义渲染器
public class MainTabPageRenderer : TabbedPageRenderer, TabLayout.IOnTabSelectedListener
{
void TabLayout.IOnTabSelectedListener.OnTabReselected(TabLayout.Tab tab)
{
if (Element is MainPage)
{
// the same tab was selected a second time, so do something
}
}
}
捕获该事件后,使用ListView.ScrollTo方法滚动到顶部。