我在自定义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
值。
有什么问题吗?
答案 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
。因此,您将删除第一个处理程序并在那里添加新的处理程序。