如何将特定的行或部分滚动到Xamarin.Forms.ListView的顶部

时间:2014-07-08 12:31:53

标签: xamarin xamarin.forms

我有一个Xamarin.Forms.ListView,其中包含按日期分组的事件。有将来发生的事件和过去发生的事件。

用户希望屏幕加载最接近当前日期的未来事件,以便他们无需手动向下滚动即可查看。

我可以使用Xamarin.Forms.ListView为iOS和Android用户提供哪些选项?

Screenshot of Current Initial View

1 个答案:

答案 0 :(得分:2)

我取得了一些进展。我可以通过创建一个CustomListView和一个支持它的iOS渲染来实现我在iOS中的目标。

在Xamarin.Forms中,您创建了一个CustomListView,然后在您加载列表后调用ScrollToRow(item,section)来手动滚动到您需要的行。

在iOS中,渲染器将方法映射到UITableView消息ScrollToRow(...);

对于Android,我仍然需要创建渲染器,但我知道我需要映射到调用getListView().setSelection(...);getListView().smoothScrollToPosition(...);

我确信有一种更优雅的方式可以做到这一点,但现在它正在完成工作

来源: Common.CustomListView

using System;
using Xamarin.Forms;

namespace Common {
    public class CustomListView : ListView {

        public Action<int, int, bool> ScrollToRowDelegate { get; set; }

        public void ScrollToRow(int itemIndex, int sectionIndex = 0, bool animated = false) {
            if (ScrollToRowDelegate != null) {
                ScrollToRowDelegate (itemIndex, sectionIndex, animated);
            }
        }
    }
}

iOS渲染器来源: YourApplication.iOS.Renderers.CustomListViewRenderer

using System;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;

using Common;

using MonoTouch.UIKit;
using MonoTouch.Foundation;

using YourApplication.iOS.Renderers;

[assembly: ExportRenderer (typeof(CustomListView), typeof(CustomListViewRenderer))]
namespace YourApplication.iOS.Renderers
{
    public class CustomListViewRenderer : ListViewRenderer
    {
        protected override void OnModelSet (VisualElement view) {
            base.OnModelSet (view);
            var listView = view as CustomListView;
            listView.ScrollToRowDelegate = (itemIndex, sectionIndex, animated) => {
                ScrollToRow(itemIndex, sectionIndex, animated);
            };
        }

        private void ScrollToRow(int itemIndex, int sectionIndex, bool animated) {
            var tableView = this.Control as UITableView;
            var indexPath = NSIndexPath.FromItemSection (itemIndex, sectionIndex);
            tableView.ScrollToRow (indexPath, UITableViewScrollPosition.Top, animated);
        }   
    }
}