我有一个Xamarin.Forms.ListView
,其中包含按日期分组的事件。有将来发生的事件和过去发生的事件。
用户希望屏幕加载最接近当前日期的未来事件,以便他们无需手动向下滚动即可查看。
我可以使用Xamarin.Forms.ListView
为iOS和Android用户提供哪些选项?
答案 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);
}
}
}