1

现在的情况

我制作了一个 xamarin 表单跨平台应用程序,它有一个带有无限滚动 listView 的选项卡式页面。每当最后一个项目出现时,listView 就会以 10 个项目的增量填充。

正常行为

通常当我们第一次点击标签页的顶部栏(包含标签页标题的栏)时(如果我们当时没有查看标签),应用程序会切换到查看该页面。这很好。

当我们第二次点击顶部栏时(点击当前查看标签页的顶部栏时),什么也没有发生(不像twitter,你可以点击滚动到顶部)

我的问题

我希望能够使 listView 在点击顶部栏时滚动回顶部(到列表中的第一个项目)(类似于 twitter 在其 android 应用程序中的操作方式),同时仍保留所有已加载的项目我的列表视图。

关于如何使顶部栏对点击做出反应以将 listView 滚动回顶部的任何想法?

4

2 回答 2

0

你应该尝试这样的事情来向上滚动

ListViewName.ScrollTo(yourobject,ScrollToPosition.Start, true);
// true means boolean for animated.

我希望这对你有帮助

于 2017-10-05T10:34:11.710 回答
0

TabbedPage 公开了一个 CurrentPageChanged 事件(或者您可以覆盖 OnCurrentPageChanged),该事件仅在所选选项卡更改时触发,因此如果您想在用户更改选项卡时滚动,则需要订阅该事件。似乎不需要这个,但以防万一......

Xamarin.Forms 没有在第二次选择已选择的选项卡时触发的内置事件。不过,您可以通过子类化 Xamarin 的 TabbedPage 渲染器来使用自定义渲染器来实现这一点。我在这里写了它,并且在这里有一个适用于 iOS、Android 和 UWPXamarin.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 方法滚动到顶部。

于 2017-10-05T15:31:34.427 回答