在Xamarin Android的ListViewrenderer中点击/滑动项目
我正在尝试在Xamarin Android ListViewRenderer中点击/滑动该项目。有人知道吗?这是我的基本情况-在我的滑动/点击事件中,我需要获取ListViewItem在Xamarin Android的ListViewrenderer中点击/滑动项目,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我正在尝试在Xamarin Android ListViewRenderer中点击/滑动该项目。有人知道吗?这是我的基本情况-在我的滑动/点击事件中,我需要获取ListViewItem public class MyListViewRenderer : ListViewRenderer { listener = new MyGestureListener(); detector= new GestureDetector(listener); listene
public class MyListViewRenderer : ListViewRenderer
{
listener = new MyGestureListener();
detector= new GestureDetector(listener);
listener.OnTapped += HandleTapped;
}
private void HandleTapped(object sender, EventArgs e)
{
// how to get the tapped item here?
}
您可以使用和在视图中使用TapGestureRecognizer的单元格布局
请检查样本代码
public class Item
{
public int id { get;set; }
public string Name { get; set; }
public decimal Rate { get; set; }
}
public class ItemRepo
{
public ItemRepo()
{
CreateItem();
}
public ObservableCollection<Item> Items { get; set; }
public void CreateItem()
{
Items = new ObservableCollection<Item>();
Items.Add(new Item() {id=1, Name = "A-104",Rate = 50 });
Items.Add(new Item() {id=2, Name = "B-104", Rate = 55 });
Items.Add(new Item() {id=3, Name = "B-806", Rate = 70 });
Items.Add(new Item() {id=4, Name = "B-107", Rate = 95 });
Items.Add(new Item() {id=5, Name = "A-105", Rate = 80 });
Items.Add(new Item() {id=6, Name = "A-106", Rate = 72 });
Items.Add(new Item() {id=7, Name = "C-188", Rate = 32 });
Items.Add(new Item() {id=8, Name = "C-194", Rate = 58 });
Items.Add(new Item() {id=9, Name = "D-897", Rate = 88 });
Items.Add(new Item() {id=10, Name = "D-968", Rate = 60 });
}
}
您可以使用和在视图中使用TapGestureRecognizer的单元格布局
请检查样本代码
public class Item
{
public int id { get;set; }
public string Name { get; set; }
public decimal Rate { get; set; }
}
public class ItemRepo
{
public ItemRepo()
{
CreateItem();
}
public ObservableCollection<Item> Items { get; set; }
public void CreateItem()
{
Items = new ObservableCollection<Item>();
Items.Add(new Item() {id=1, Name = "A-104",Rate = 50 });
Items.Add(new Item() {id=2, Name = "B-104", Rate = 55 });
Items.Add(new Item() {id=3, Name = "B-806", Rate = 70 });
Items.Add(new Item() {id=4, Name = "B-107", Rate = 95 });
Items.Add(new Item() {id=5, Name = "A-105", Rate = 80 });
Items.Add(new Item() {id=6, Name = "A-106", Rate = 72 });
Items.Add(new Item() {id=7, Name = "C-188", Rate = 32 });
Items.Add(new Item() {id=8, Name = "C-194", Rate = 58 });
Items.Add(new Item() {id=9, Name = "D-897", Rate = 88 });
Items.Add(new Item() {id=10, Name = "D-968", Rate = 60 });
}
}
首先,在PCL项目中需要CustomList和CustomViewCell CustomViewCell(XML) 客户列表
public class CustomList : ListView
{
public delegate void CellItemTapedEvent(object source, EventArgs e);
public event CellItemTapedEvent CellItemTaped;
public CustomList() :base()
{
}
protected override void SetupContent(Cell content, int index)
{
base.SetupContent(content, index);
if(content is CustomViewCell)
{
CustomViewCell cell = (CustomViewCell)content;
cell.CellTaped += Cell_CellTaped;
}
}
private void Cell_CellTaped(object source, EventArgs e)
{
CellItemTaped?.Invoke(source, e);
}
protected override void UnhookContent(Cell content)
{
if (content is CustomViewCell)
{
CustomViewCell cell = (CustomViewCell)content;
cell.CellTaped -= Cell_CellTaped;
}
base.UnhookContent(content);
}
}
主页(XML)
ListViewRendere
[assembly: ExportRenderer(typeof(CustomList), typeof(MyListView))]
namespace ListViewRendererCross.Droid
{
public class MyListView : ListViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// unsubscribe
if (e.NewElement is CustomList)
{
CustomList list = (CustomList)e.NewElement;
list.CellItemTaped -= List_CellItemTaped;
}
}
var th = this;
if (e.NewElement != null)
{
// subscribe
if(e.NewElement is CustomList)
{
CustomList list = (CustomList)e.NewElement;
list.CellItemTaped += List_CellItemTaped;
}
}
}
private void List_CellItemTaped(object source, EventArgs e)
{
//Hear you will get your Taped Item
Item SelectedItem = (Item)((CustomViewCell)source).BindingContext;
Android.App.AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.BaseActivity);
AlertDialog alert = dialog.Create();
alert.SetTitle("Alert");
alert.SetMessage("Name : " + SelectedItem.Name + " , Rate : " + SelectedItem.Rate);
alert.Show();
}
}
}
[程序集:ExportRenderer(typeof(CustomList)、typeof(MyListView))]
命名空间ListViewRenderCross.Droid
{
公共类MyListView:ListViewRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement!=null)
{
//退订
如果(例如,新元素是CustomList)
{
CustomList=(CustomList)e.NewElement;
list.CellItemTaped-=list\u CellItemTaped;
}
}
var th=这个;
if(例如NewElement!=null)
{
//订阅
如果(例如,新元素是CustomList)
{
CustomList=(CustomList)e.NewElement;
list.CellItemTaped+=列表_CellItemTaped;
}
}
}
私有无效列表\u CellItemTaped(对象源,事件参数e)
{
//听说你会得到你的录音物品
Item SelectedItem=(Item)((CustomViewCell)源);
Android.App.AlertDialog.Builder dialog=新建AlertDialog.Builder(MainActivity.BaseActivity);
AlertDialog alert=dialog.Create();
警报。设置标题(“警报”);
alert.SetMessage(“名称:“+SelectedItem.Name+”,速率:“+SelectedItem.Rate”);
alert.Show();
}
}
}
首先,您需要在PCL项目中使用CustomList和CustomViewCell
CustomViewCell(XML)
客户列表
public class CustomList : ListView
{
public delegate void CellItemTapedEvent(object source, EventArgs e);
public event CellItemTapedEvent CellItemTaped;
public CustomList() :base()
{
}
protected override void SetupContent(Cell content, int index)
{
base.SetupContent(content, index);
if(content is CustomViewCell)
{
CustomViewCell cell = (CustomViewCell)content;
cell.CellTaped += Cell_CellTaped;
}
}
private void Cell_CellTaped(object source, EventArgs e)
{
CellItemTaped?.Invoke(source, e);
}
protected override void UnhookContent(Cell content)
{
if (content is CustomViewCell)
{
CustomViewCell cell = (CustomViewCell)content;
cell.CellTaped -= Cell_CellTaped;
}
base.UnhookContent(content);
}
}
主页(XML)
ListViewRendere
[assembly: ExportRenderer(typeof(CustomList), typeof(MyListView))]
namespace ListViewRendererCross.Droid
{
public class MyListView : ListViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// unsubscribe
if (e.NewElement is CustomList)
{
CustomList list = (CustomList)e.NewElement;
list.CellItemTaped -= List_CellItemTaped;
}
}
var th = this;
if (e.NewElement != null)
{
// subscribe
if(e.NewElement is CustomList)
{
CustomList list = (CustomList)e.NewElement;
list.CellItemTaped += List_CellItemTaped;
}
}
}
private void List_CellItemTaped(object source, EventArgs e)
{
//Hear you will get your Taped Item
Item SelectedItem = (Item)((CustomViewCell)source).BindingContext;
Android.App.AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.BaseActivity);
AlertDialog alert = dialog.Create();
alert.SetTitle("Alert");
alert.SetMessage("Name : " + SelectedItem.Name + " , Rate : " + SelectedItem.Rate);
alert.Show();
}
}
}
[程序集:ExportRenderer(typeof(CustomList)、typeof(MyListView))]
命名空间ListViewRenderCross.Droid
{
公共类MyListView:ListViewRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement!=null)
{
//退订
如果(例如,新元素是CustomList)
{
CustomList=(CustomList)e.NewElement;
list.CellItemTaped-=list\u CellItemTaped;
}
}
var th=这个;
if(例如NewElement!=null)
{
//订阅
如果(例如,新元素是CustomList)
{
CustomList=(CustomList)e.NewElement;
list.CellItemTaped+=列表_CellItemTaped;
}
}
}
私有无效列表\u CellItemTaped(对象源,事件参数e)
{
//听说你会得到你的录音物品
Item SelectedItem=(Item)((CustomViewCell)源);
Android.App.AlertDialog.Builder dialog=新建AlertDialog.Builder(MainActivity.BaseActivity);
AlertDialog alert=dialog.Create();
警报。设置标题(“警报”);
alert.SetMessage(“名称:“+SelectedItem.Name+”,速率:“+SelectedItem.Rate”);
alert.Show();
}
}
}
谢谢,但我确实需要在渲染器中执行此操作,因为它还具有滑动和其他手势。目前,我在ViewRenderer中为Recycler重用手势并导致其他视图被滑动或触摸的部分工作。我需要一些时间在ListViewRenderer中实现此功能。谢谢,但我确实需要在渲染器中执行此操作,因为它也会有滑动和其他手势。目前,我在ViewRenderer中为回收器重用手势并导致其他视图被滑动或触摸的部分工作。我需要一些时间在ListViewRenderer中实现这一点。
<ContentPage.Content>
<StackLayout VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
<local:CustomList x:Name="ItemList">
<ListView.ItemTemplate>
<DataTemplate>
<local:CustomViewCell NumberOfTapsRequired="2" Name="{Binding Name}">
</local:CustomViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</local:CustomList>
</StackLayout>
</ContentPage.Content>
public partial class MainPage : ContentPage
{
ItemRepo ItemRepo = null;
public MainPage()
{
InitializeComponent();
ItemRepo = new ItemRepo();
ItemList.ItemsSource = ItemRepo.Items;
}
}
[assembly: ExportRenderer(typeof(CustomList), typeof(MyListView))]
namespace ListViewRendererCross.Droid
{
public class MyListView : ListViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// unsubscribe
if (e.NewElement is CustomList)
{
CustomList list = (CustomList)e.NewElement;
list.CellItemTaped -= List_CellItemTaped;
}
}
var th = this;
if (e.NewElement != null)
{
// subscribe
if(e.NewElement is CustomList)
{
CustomList list = (CustomList)e.NewElement;
list.CellItemTaped += List_CellItemTaped;
}
}
}
private void List_CellItemTaped(object source, EventArgs e)
{
//Hear you will get your Taped Item
Item SelectedItem = (Item)((CustomViewCell)source).BindingContext;
Android.App.AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.BaseActivity);
AlertDialog alert = dialog.Create();
alert.SetTitle("Alert");
alert.SetMessage("Name : " + SelectedItem.Name + " , Rate : " + SelectedItem.Rate);
alert.Show();
}
}
}