2010-08-11 7 views
1

J'ai un ListActivity. Chaque élément du ListView contient un RatingBar. Lorsque l'utilisateur manipule le RatingBar, je souhaite mettre à jour les données correspondantes attachées à l'adaptateur.Modification des données de l'adaptateur

Malheureusement, dans mon gestionnaire RatingBar, je ne peux pas me référer à la variable de position. Je comprends pourquoi. J'ai juste du mal à trouver un moyen de contourner ça.

Comment pourrais-je gérer ce que j'essaie de faire ici?

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // grab view 
    View v = convertView; 
    // set view layout 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.layout_rating_ratingbubble, null); 
     RatingBar r = (RatingBar)v.findViewById(R.id.rating_rating); 
     if (r != null) { 
      r.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { 
        public void onRatingChanged(RatingBar ratingBar, float rating, 
          boolean fromUser) { 
         // CANT REFER TO position HERE 
         m_items.get(position).setRating((int)rating); 
        } 
       }); 
     } 
+0

Vous avez d'autres idées? – Andrew

Répondre

0

Voici ce que je l'ai fait ...

l'intérieur du gestionnaire onRatingChanged, nous devons d'abord trouver la position. J'ai créé une petite méthode pour faire ceci:

private int getListPosition(View v) { 
     View vParent = (View)v.getParent(); 
     if (vParent != null) { 
      ViewGroup vg = (ViewGroup)vParent.getParent(); 
      if (vg != null) { 
       return getListView().getFirstVisiblePosition() + vg.indexOfChild(vParent); 
      } 
     } 
     return -1; 
    } 

Le reste est simple. Prenez le résultat de cette méthode (x) et appelez:

m_items.get(x).setRating((int)rating); 
0

Je comprends que votre code ne fonctionne pas vous donner une erreur sur:

m_items.get(position).setRating((int)rating); 

Essayez de faire ceci:

if (r != null) { 
      final int position2 = position; 
      r.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { 
        public void onRatingChanged(RatingBar ratingBar, float rating, 
          boolean fromUser) { 
         m_items.get(position2).setRating((int)rating); 
        } 
       }); 
+0

Merci pour votre réponse. Cela ne fonctionne pas pour moi. Quand je débogue le gestionnaire, il dit que position2 ne peut pas être résolu. – Andrew

0

Que diriez-vous quelque chose comme ceci:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // grab view 
    View v = convertView; 
    // set view layout 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.layout_rating_ratingbubble, null); 
     RatingBar r = (RatingBar)v.findViewById(R.id.rating_rating); 
     if (r != null) { 
      r.setTag(position); // Set the position number as the tag on the view 
      r.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { 
        public void onRatingChanged(RatingBar ratingBar, float rating, 
          boolean fromUser) { 
         int item_position = (int)ratingBar.getTag(); // Retrieve tag 
         m_items.get(item_position).setRating((int)rating); 
        } 
       }); 
     } 
     return v; 
} 

Bien, j'ajouterais probablement le RatingBar.OnRatingBarChangeListener interface vers un autre objet qui est instancié une fois. (Même l'adaptateur, si vous le vouliez, bien qu'il n'appartienne probablement pas à cet emplacement.) En l'état, vous créez un nouvel objet écouteur pour chaque RatingBar et c'est un peu inutile dans le département de la mémoire.

+0

Quelqu'un a posté cette solution et a ensuite supprimé la solution une fois que j'ai posé mon problème avec elle. Mon problème est que ma liste peut être modifiée par l'utilisateur (ex: supprimer une ligne). Cela gâche tous les indices des lignes en dessous de la ligne supprimée. Peut-être que l'ajout d'un cas ELSE à cette déclaration IF et la mise à jour de l'étiquette aideraient, mais évidemment cela ne se produit que lorsque la ligne apparaît. Il peut y avoir des situations où cela provoque un comportement étrange. – Andrew

+0

Je pense que tag n'est vraiment utile que lorsque vous utilisez l'identifiant d'une ligne pour les données qui la sous-tendent. L'utilisation des index devient problématique. – Andrew

Questions connexes