在ListView中委派click事件

时间:2014-08-25 22:29:14

标签: android listview xamarin xamarin.android

我在自定义GetView的{​​{1}}方法中的Xamarin项目中有以下代码:

Adapter

Android var document = elementList[position].DocumentID; view.FindViewById<LinearLayout> (Resource.Id.btnOpen).Click += delegate { OpenElement (document); }; 会回收列表项,以便提高内存效率,我知道。但是,当我单击ListView时,会调用btnOpen函数,但错误的OpenElement值(该值是document中第一个元素的值)。我认为这是一个奇怪的条件,因为那里有一个委托,而且可能没有相应地获得Listview值。

有什么问题吗?

2 个答案:

答案 0 :(得分:0)

你可能想做类似的事情:

var ll = view.FindViewById<LinearLayout> (Resource.Id.btnOpen);
ll.Tag = position;
ll.Click += (s,e) => {
    var view = (View) sender;
    var position = (int) view.Tag;

    var document = elementList[position].DocumentID;
    OpenElement (document);
};

或者您将实现ViewHolder模式。

答案 1 :(得分:0)

这是一种常见的不端行为。您之前是否在添加新事件之前已从事件处理程序中删除/取消订阅?

您可以通过创建这样的私有函数轻松创建点击处理程序:

private void HandleClick(object sender, EventArgs e) {
    var snd = ((LinearLayout) sender).Tag;
}

所以,像Cheesebaron说的那样,将相关数据添加到视图标记中,方法是将其指定为ll.Tag = document,然后在上面的HandleClick函数中,您可以检索正确的值(不要&# 39;忘记将结果转换为适当的类。)

并且,为了解决您的问题,您首先需要通过执行以下操作取消订阅事件处理程序:ll.Click -= HandleClick;然后添加新的处理程序:ll.Click += HandleClick。因此,您将删除第一个处理程序并在那里添加新的处理程序。