我有一個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