如何将特定行或节滚动到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
messageScrollToRow(…)代码>
对于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);
}
}
}