在Xamarin Android的ListViewrenderer中点击/滑动项目

在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

我正在尝试在Xamarin Android ListViewRenderer中点击/滑动该项目。有人知道吗?这是我的基本情况-在我的滑动/点击事件中,我需要获取ListViewItem

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项目中需要CustomListCustomViewCell

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项目中使用CustomListCustomViewCell

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();
            }


        }



     }