Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将特定行或节滚动到Xamarin.Forms.ListView的顶部_Xamarin_Xamarin.forms - Fatal编程技术网

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

如何将特定行或节滚动到Xamarin.Forms.ListView的顶部,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我有一个Xamarin.Forms.ListView,其中包含按日期分组的事件。有未来发生的事件,也有过去发生的事件 用户希望在屏幕上加载与当前日期最接近的未来事件,这样他们就不需要手动向下滚动查看 对于iOS和Android用户,我可以通过Xamarin.Forms.ListView使用哪些选项来实现这一点 我取得了一些进展。通过创建CustomListView和支持它的iOS渲染,我能够在iOS中实现我的目标 在Xamarin.Forms中,您创建一个CustomListView,然后在加载

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

用户希望在屏幕上加载与当前日期最接近的未来事件,这样他们就不需要手动向下滚动查看

对于iOS和Android用户,我可以通过
Xamarin.Forms.ListView
使用哪些选项来实现这一点


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

在Xamarin.Forms中,您创建一个CustomListView,然后在加载列表后,您可以调用
ScrollToRow(项目,部分)
手动滚动到所需的行

在iOS中,渲染器将方法映射到
UITableView
message
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);
            }
        }
    }
}

我猜Xamarin.Forms API中可能还不支持滚动到项目。这不是一个确定的答案,但从我对API的探索来看,这似乎是未来发布的一个问题。请不要引用我的话。如何在每行上获得右括号按钮?我想知道,是否有一种使用
SelectedItem
属性的快速而肮脏的方法。请看这里:
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);
        }   
    }
}