Mam ListView z ustawionym ArrayAdapter, a każdy wiersz w adapterze zawiera cztery przyciski, które muszą odbierać i obsługiwać zdarzenia kliknięcia. Zwykle w Androidzie nazywałbym się SetOnClickListener
na każdym przycisku podczas tworzenia komórki, ale Mono daje możliwość ustawienia programów obsługi zdarzeń dla zdarzenia Click
. Wygląda na to, że w Mono jest trochę dziwności, ponieważ napotykam na jedną z dwóch kwestii w zależności od tego, gdzie ustawiam moduł obsługi zdarzeń.Monodroid - Obsługa zdarzeń kliknięcia w wierszach ListAdapter
ArrayAdapter GetView Przykład 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));
}
Tutaj mój obsługi zdarzeń tylko zostanie ustawiony raz na przycisk (dobre!), Ale wartość position
jest źle przez większość czasu. Zastanawiam się, czy konwersja z Mono na kod Androida powoduje, że GetItem(position)
używa tej samej wartości dla position
za każdym razem (wartość, która position
jest ustawiona na kiedy komórka jest najpierw tworzona). Ten kod działa zupełnie normalnie w normalnym systemie Android.
ArrayAdapter GetView Przykład 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));
Metoda ta powoduje zdarzenia kliknięcie do wypalania dla prawidłowego position
, ale tworzy nowy obsługi zdarzeń przy każdym rzędzie jest przywracana. Powoduje to zdarzenia kliknięcia dla wielu wierszy w tym samym czasie. Wydaje się, że obejście tej metody zachowuje odniesienia do procedur obsługi zdarzeń i usuwa je przed ponownym ustawieniem w numerze GetView
, ale wydaje się to wyjątkowo nieeleganckie.
Czy istnieje lepsza metoda obsługi zdarzeń kliknięcia w elementach ListView w Monodroid?
Wpadłem na ten sam problem. Sposób, w jaki to rozwiązałem, polegał na użyciu wzorca ViewHolder. Zawsze możesz przesunąć pozycję w tagu dla convertView i wyciągnąć ją w module obsługi zdarzeń kliknięcia. – snowCrabs