2017-08-07 2 views
0

Je suis l'implémentation d'une vue de cartes magnétiques dans Xamarin.Android. Je déclenche un événement à partir de RatingCardAdapter pour réinitialiser la vue des cartes magnétiques après que toutes les cartes ont été glissées. Pour la première fois, l'événement n'est pas nul et les cartes magnétiques sont réinitialisées, mais au second essai, le gestionnaire d'événements renvoie null. Par conséquent, je ne peux pas définir la valeur de shouldResetSwipe. Comment puis-je résoudre ce problème?Le gestionnaire d'événements renvoie null C#?

Adaptateur

public class RatingCardAdapter : BaseCardAdapter 
{ 
private Context context; 
public event EventHandler OnLastCardSwiped;  
public RatingCardAdapter(Context context, SwipeCardsView SwipeView) 
{ 
    this.context = context; 
    this.SwipeView = SwipeView; 
    SwipeView.SetCardsSlideListener(this); 
} 
public void OnCardVanish(int p0, SwipeCardsView.SlideType p1) 
{ 
if (p0 == (Count - 1)) // p0 becomes 4 when last card is swiped 
{ 
if (OnLastCardSwiped != null) //becomes null when rating adapter called 2nd time 
    OnLastCardSwiped(this, new OnLastCardSwipeArgs 
     { 
     shouldResetSwipe = true }); 
     } 
} 
public class OnLastCardSwipeArgs : EventArgs 
{ 
    public bool shouldResetSwipe { get; set; } 
} 

Activité

private SwipeCardsView swipeCardsView; 
RatingCardAdapter ratingCardAdapter; 
protected override void OnCreate(Bundle savedInstanceState)  
{    
    base.OnCreate(savedInstanceState); 
    SetContentView(Resource.Layout.activity_rating_session); 
    swipeCardsView = FindViewById<SwipeCardsView>    
        (Resource.Id.swipeCardsRating);             
    swipeCardsView.RetainLastCard(false);     
    swipeCardsView.EnableSwipe(true);  
    setSwipeData(); 
}  
void setSwipeData() {  
    ratingCardAdapter = new RatingCardAdapter(this, swipeCardsView); 
    swipeCardsView.SetAdapter(ratingCardAdapter); 
    ratingCardAdapter.OnLastCardSwiped += (sender, e) => 
     { 
     if (e.shouldResetSwipe) 
     { 
      Console.WriteLine("restart set " + e.shouldResetSwipe); 
      restartSwipeCard();  
     }}; 
} 
void restartSwipeCard() 
    {   
    Console.WriteLine("restartswipe"); 
    ratingCardAdapter = new RatingCardAdapter(this,swipeCardsView); 
    swipeCardsView.SetAdapter(ratingCardAdapter);   
    } 

Répondre

0

Puisque vous créez une nouvelle instance de RatingCardAdapter dans la méthode restartSwipeCard, vous devez vous abonner aussi, il est l'événement aussi, depuis sa liée à RatingCardAdapter intance. Donc déplacer votre méthode lambda pour intance méthode pour éviter la duplication de code et faire même abonnement à l'intérieur restartSwipeCard méthode:

Ou encore mieux renommer setSwipeData-initSwipeData et le code de mise à jour comme celui-ci:

private SwipeCardsView swipeCardsView; 
RatingCardAdapter ratingCardAdapter; 

protected override void OnCreate(Bundle savedInstanceState)  
{    
    base.OnCreate(savedInstanceState); 
    SetContentView(Resource.Layout.activity_rating_session); 
    swipeCardsView = FindViewById<SwipeCardsView>    
        (Resource.Id.swipeCardsRating);             
    swipeCardsView.RetainLastCard(false);     
    swipeCardsView.EnableSwipe(true);  
    initSwipeData(); 
}  

private void initSwipeData() 
{  
    ratingCardAdapter = new RatingCardAdapter(this, swipeCardsView); 
    swipeCardsView.SetAdapter(ratingCardAdapter); 
    ratingCardAdapter.OnLastCardSwiped += (sender, e) => 
     { 
     if (e.shouldResetSwipe) 
     { 
      Console.WriteLine("restart set " + e.shouldResetSwipe); 
      Console.WriteLine("restartswipe"); 
      initSwipeData();  
     }}; 
} 
+0

Merci Yura, vous êtes un sauveur de la vie. –

+0

Heureux que cela vous a aidé! Ne pas oublier de marquer la réponse comme correcte) – Yura