La funzione ListView di Android riutilizza le righe che sono state sfogliate. Ma sembra essere un problema quando si gestiscono eventi nelle viste secondarie di una riga in C#.Monodroid: gestione degli eventi su child Visualizzazioni delle righe di ListView riutilizzate
Un accettato modo di aggiungere gestori di eventi in Java è esplicitamente impostare un gestore in questo modo:
ImageView img = (ImageView) row.findViewById(R.id.pic);
img.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
System.out.println(position);
}
});
documenti sul sito di Xamarin incoraggiare gli sviluppatori a utilizzare C# 's aggiungere evento modello ascoltatore che non lo fa gioco piacevole con le righe di riuso:
ImageView img = row.FindViewById<ImageView> (Resource.Id.pic);
img.Click += (sender, e) => {
Console.WriteLine(position);
};
Il modello Java sopra il quale imposta un gestore di eventi è adatto per il riutilizzo della riga mentre il modello C# sotto di esso che aggiunge un gestore di eventi fa sì che i gestori si accumulino sulle visualizzazioni figlio delle righe riutilizzate.
Il codice seguente mostra il mio metodo GetView
da un BaseAdapter personalizzato che ho scritto.
public override Android.Views.View GetView (int position,
View convertView, ViewGroup parent)
{
View row = convertView;
//TODO: solve event listener bug. (reused rows retain events).
if (row == null) {
row = LayoutInflater.From (userListContext)
.Inflate (Resource.Layout.UserListUser, null, false);
}
ImageView profilePic = row.FindViewById<ImageView> (Resource.Id.profilePic);
//if(profilePic.Clickable) { /** kill click handlers? **/ }
profilePic.Click += async (object sender, EventArgs e) => {
Bundle extras = new Bundle();
extras.PutString("id", UserList[position].id);
Intent intent = new Intent(userListContext, typeof(ProfileActivity));
intent.PutExtras(extras);
postListContext.StartActivity(intent);
};
return row;
}
Il problema è che, quando una riga viene riutilizzato, la vista profilePic
ha ancora l'originale gestore "click" allegata.
C'è un modo per (a) eliminare profilePic.Click
o (b) utilizzare lo schema Java di Android con funzioni anonime?
Oppure, esiste un modello migliore da utilizzare dove il gestore "clic" può ancora accedere al valore corretto di position
?
Grazie! Lo proverò. C'è una soluzione che potrebbe mantenere l'accesso ad altre cose nell'ambito della mia funzione GetView? – MicronXD
@MicronXD: ok provalo. Cosa vuoi accedere nell'ambito del mio GetView? –
@MicronXD: anche il mio suggerimento è usare 'ViewHolder Pattern' per buone prestazioni di ListView ed evitare di ricreare di nuovo le viste che sono già state create, come segue [Xamarin Android: l'eliminazione di elementi da ListView elimina DUE elementi] (http://quabr.com/28474874/xamarin-android-delete-item-from-listview-deletes-two-items) probabilmente più utile –