我有一个ListView,并为其设置了一个ArrayAdapter,并且适配器中的每一行都包含需要接收和处理点击事件的四个按钮。通常在Android中,我会在创建单元格时在每个按钮上调用SetOnClickListener
,但是Mono可以为事件Click
事件设置事件处理程序。看起来在Mono中有一些奇怪的地方,因为我遇到了两个问题之一,这取决于我设置事件处理程序的位置。Monodroid - 处理ListAdapter行内的Click事件
ArrayAdapter GetView例1:
View tweetCell = convertView;
if (tweetCell == null) {
tweetCell = ((LayoutInflater)Context.GetSystemService (Context.LayoutInflaterService)).Inflate (Resource.Layout.TweetCell, null);
tweetCell.FindViewById (Resource.Id.btn_moveTweet).Click += (object sender, EventArgs e) => MoveTweet (GetItem(position));
tweetCell.FindViewById (Resource.Id.btn_unfavoriteTweet).Click += (object sender, EventArgs e) => UnfavoriteTweet (GetItem(position));
tweetCell.FindViewById (Resource.Id.btn_hideTweet).Click += (object sender, EventArgs e) => HideTweet (GetItem(position));
tweetCell.FindViewById (Resource.Id.btn_shareTweet).Click += (object sender, EventArgs e) => ShareTweet (GetItem(position));
}
在这里,我的事件处理程序只被设置一次,每个按钮(好!),但position
值大部分时间是错误的。我想知道从单声道到Android代码的转换是否导致GetItem(position)
每次都使用position
的相同值(position
设置为在单元格第一次创建时的值)。这段代码在普通的Android系统中完全可以工作。
ArrayAdapter GetView例2:
View tweetCell = convertView;
if (tweetCell == null) {
tweetCell = ((LayoutInflater)Context.GetSystemService (Context.LayoutInflaterService)).Inflate (Resource.Layout.TweetCell, null);
}
tweetCell.FindViewById (Resource.Id.btn_moveTweet).Click += (object sender, EventArgs e) => MoveTweet (GetItem(position));
tweetCell.FindViewById (Resource.Id.btn_unfavoriteTweet).Click += (object sender, EventArgs e) => UnfavoriteTweet (GetItem(position));
tweetCell.FindViewById (Resource.Id.btn_hideTweet).Click += (object sender, EventArgs e) => HideTweet (GetItem(position));
tweetCell.FindViewById (Resource.Id.btn_shareTweet).Click += (object sender, EventArgs e) => ShareTweet (GetItem(position));
这种方法确实会导致正确的position
被解雇的单击事件,但它的每行循环时间设置一个新的事件处理程序。这会导致大量行的点击事件同时发生。此方法的解决方法似乎是保持对事件处理程序的引用,并在将它们再次设置到GetView
之前将其删除,但这看起来非常不雅观。
是否有更好的方法来处理Monodroid中的ListView项目内的点击事件?
我遇到了同样的问题。我解决它的方式是使用ViewHolder模式。您可以随时在convertView的标签中推入位置,并在click事件处理程序中将其拉出。 – snowCrabs 2013-04-26 15:48:30