Monodroid - 处理ClickAdapter行中的Click事件

Big*_*osh 9 mono android xamarin.android android-listview xamarin

我有一个设置了ArrayAdapter的ListView,并且适配器中的每一行都包含四个需要接收和处理点击事件的按钮.通常在Android中,我会SetOnClickListener在创建单元格时调用每个按钮,但Mono可以为事件设置事件处理程序Click.看起来在Mono中有一些奇怪的东西,因为我遇到了两个问题之一,这取决于我设置事件处理程序的位置.

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));
}
Run Code Online (Sandbox Code Playgroud)

在这里,我的事件处理程序每​​个按钮只设置一次(好!),但position大多数时候该值都是错误的.我想知道从Mono到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));
Run Code Online (Sandbox Code Playgroud)

此方法确实会导致click事件被触发正确position,但每次回收行时它都会设置一个新的事件处理程序.这会导致同时有很多行的点击事件.这种方法的解决方法似乎是保持对事件处理程序的引用并在再次设置它们之前删除它们GetView,但这看起来非常不优雅.

有没有更好的方法来处理Monodroid中ListView项目中的点击事件?

Aar*_* He 0

我也有类似的问题。显然,我会避免解决方案2。此外,我观察到解决方案1中的问题只发生在Android 2.3上。

这就是我解决问题的方法。

ListView我在适配器中保留了对 的引用,例如_listView。然后,在您的GetItem()方法中(不要错过该position变量。它的值是一个谜),调用_listView.GetPositionForView((View)sender)以获取正确的位置。