Listview Xamarin表单如何创建可拖动的列表视图

Listview Xamarin表单如何创建可拖动的列表视图,listview,xamarin.forms,draggable,Listview,Xamarin.forms,Draggable,是否可以使用Xamarin表单创建包含可拖动列表项的listview 我在下面的链接中找到了android中实现的这一点,但我不确定如何在Xamarin.Forms中实现这一点,我想我需要为此添加特定于平台的代码 此外,正如下面的Xamarin论坛帖子所示,控件似乎不支持拖放功能,因此需要创建自定义渲染器,但我不太确定从何处开始 正如您在链接中指出的,仅使用提供的Xamarin.Forms控件是不可能的 因此,您必须为每个平台实现自定义渲染器 上有一个很棒的教程 在该页面的最底部是一个视频,我

是否可以使用Xamarin表单创建包含可拖动列表项的listview

我在下面的链接中找到了android中实现的这一点,但我不确定如何在Xamarin.Forms中实现这一点,我想我需要为此添加特定于平台的代码

此外,正如下面的Xamarin论坛帖子所示,控件似乎不支持拖放功能,因此需要创建自定义渲染器,但我不太确定从何处开始


正如您在链接中指出的,仅使用提供的Xamarin.Forms控件是不可能的

因此,您必须为每个平台实现自定义渲染器

上有一个很棒的教程

在该页面的最底部是一个视频,我真的建议您浏览一下,因为它信息丰富,应该让您为AndroidiOS编写自己的自定义渲染器类。同样的原则也适用于Windows Phone,因此,如果您想实现这一目标,也不应该太难。

对于iOS,您可以利用本机
UITableView
控件的重新排序功能。为
列表视图
创建一个自定义渲染器,该视图告诉iOS您希望所有行都可以移动。让它更新源列表的顺序以匹配用户的操作

从一个子类开始

public类EditListView:ListView{}
然后添加一个自定义渲染器,该渲染器更新
ListView.ItemsSource
,以反映更改的顺序。此代码假定
itemsource
是一个
列表
,其中
ListItem
具有
Id
Name
类型字符串的属性

[程序集:ExportRenderer(typeof(EditListView)、typeof(EditListViewRenderer))]
公共类EditListViewRenderer:ListViewRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null){
Control.Source=newTableViewSource((List)e.NewElement.ItemsSource);
Control.Editing=true;
}
}
类TableViewSource:UITableViewSource
{
只读列表项;
公共TableViewSource(列表项){this.items=items;}
公共覆盖UITableViewCell GetCell(UITableView tableView,NSIndexPath indexPath)
{
var item=items[indexPath.Row];
var cell=new UITableViewCell(UITableViewCellStyle.Default,item.Id);//不回收。如果列表足够大,需要回收,用户不会很乐意手动重新排序。:-)
cell.TextLabel.Text=项目名称;
返回单元;
}
公共重写void MoveRow(UITableView tableView、NSIndexPath sourceIndexPath、NSIndexPath destinationIndexPath)
{
int source=sourceindepath.Row,dest=destinationindepath.Row;
var movedItem=项目[来源];
项目移除(来源);
如果(震源>目的地)——震源;
项目。插入(目的地、移动数据项);
}
public override nint rowsinssection(UITableView tableview,nint section)=>items.Count;
public override bool CanMoveRow(UITableView tableView,nsindepath indepath)=>true;
public override bool CanEditRow(UITableView tableView,nsindepath indepath)=>true;//只能移动可编辑的行。
public override bool应该在编辑时删除(UITableView tableView,nsindepath indepath)=>false;
公共覆盖UITableViewCellEditingStyle EditingStyleForRow(UITableView表格视图,NSIndexPath indexPath)=>UITableViewCellEditingStyle.None;
}
}

感谢您的链接,我将查看教程并尝试implementation@ChadBonthuys-你最终成功了吗?如果你能发布你的解决方案那就太好了:)@JeremyThompson我很久以前就遇到过这个问题,Xamarin.Forms从那时起已经走过了很长的路。当时,我采用了一个简单的实现,使用一个带有上/下箭头的自定义视图单元格,将PropertyChangedEventHandler绑定到listview,以刷新事件激活时的项目源。从那以后,Xamarin已经发布了长时间的新闻发布会和更好的触摸手势,所以我相信这现在是可能的,但从那以后我就再也没有重温过。这里是一个链接的参考,如果有人在寻找xamarin android本机解决方案的draggable list,您可以在这里查看: