2010-08-09 13 views
18

Tengo un ListView que utiliza diferentes archivos XML para crear vistas y crear elementos. Uno de estos archivos XML contiene una RatingBar. Todo se muestra y se ve excelente.RatingBar onClick

Estoy tratando de conectar un controlador onClick a la Barra de clasificación para iniciar una nueva actividad. Mi RatingBar es de estilo? Android: attr/ratingBarStyleSmall; por lo tanto, es solo un indicador (quiero que el pequeño clic de RatingBar lleve al usuario a una Actividad en la que pueden hacer varias clasificaciones).

Mi problema es que el controlador onClick para la barra de calificación nunca se ejecuta. Lo que lo hace más interesante es que he usado el mismo código para hacer clic en LinearLayout y funciona bien. ¿Alguien podría decirme por qué?

getView Mi adaptador de mira como tal:

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

    int type = getItemViewType(position); 

    // get the View for this list item 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     switch (type) { 
      // ... 
      case TYPE_LOOKUP: 
       v = vi.inflate(R.layout.layout_itemlist_itemlookup, parent, false); 
       LinearLayout vLookup = (LinearLayout)v.findViewById(R.id.itemlist_lookup); 
       if (vStore != null) { 
        vStore.setOnClickListener(new View.OnClickListener() { 
          public void onClick(View v) { 
           // THIS HANDLER WORKS FINE 
           Intent intentLaunchLookup = new Intent(ActivityItemList.this, ActivityLookup.class); 
           startActivity(intentLaunchLookup); 
          } 
         }); 
       } 
       break; 
      case TYPE_SEPARATOR: 
       v = vi.inflate(R.layout.layout_itemlist_itemseparator, parent, false); 
       RatingBar r = (RatingBar)v.findViewById(R.id.itemlist_rating); 
       if (r != null) { 
        r.setOnClickListener(new View.OnClickListener() { 
          public void onClick(View v) { 
           // THIS HANDLER DOES NOT GET EXECUTED (r IS NOT NULL; SO THIS SHOULD HAVE BEEN CREATED) 
           Intent intentLaunchRating = new Intent(ActivityItemList.this, ActivityRating.class); 
           startActivity(intentLaunchRating); 
          } 
         }); 
       } 
       break; 
      // ... 
     } 
    } 
    // … 

    // return the created view 
    return v; 
} 
+0

¿Alguien tiene comentarios adicionales sobre esto? Todavía no puedo ejecutar el controlador onClick. Como puede ver, estoy usando el mismo código para LinearLayout y funciona bien. My RatingBar está configurado para hacer clic. Establecí puntos de interrupción dentro de los oyentes onClick tanto para LinearLayout como para RatingBar y solo se ejecuta el controlador LinearLayout. Nota: The RatingBar NO está dentro de LinearLayout. Como puede ver, están en dos archivos XML diferentes. – Andrew

Respuesta

53

La razón de setOnClickListener() que no trabaja es que RatingBar anulaciones onTouchEvent() (en realidad su superclase, AbsSeekBar, lo hace) y nunca dejar View cuidar de él, por lo que nunca se View#performClick() se llama (que habría llamado el OnClickListener).

dos soluciones posibles:

    derivan de RatingBar y anular onTouchEvent()
    uso OnTouchListener lugar, así:
     
    ratingBar.setOnTouchListener(new OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         if (event.getAction() == MotionEvent.ACTION_UP) { 
          // TODO perform your action here 
         } 
         return true; 
        } 
    

HTH, Jonas

1

En un ListView, por lo general, tiene que decidir si desea que los elementos de la lista de vista que se puede hacer clic, o un elemento de contenido dentro de la vista de lista. ¿Devuelve r.isClickable() verdadero?

Puede tener una mejor configuración de la suerte haciendo clic en falso en la Barra de valoración, y en su lugar usar onClickListener de listView para tratar con los eventos de clic en la fila listView.

+0

No deseo que se pueda hacer clic en el elemento de la lista en su totalidad, pero quiero que se pueda hacer clic en elementos individuales dentro de un elemento de la lista. Ya he logrado esto con un artículo de LinearLayout. El código es exactamente el mismo y el controlador onClick se ejecuta perfectamente. No entiendo por qué uno de RatingBar no lo hace. Actualizaré mi publicación principal para reflejar esto, 1 momento – Andrew

4

He pirateado este problema al ajustar la barra de calificación en LinearLayout y adjuntar un oyente onClick a LinearLayout. No me gusta hacer esto, pero funciona. Por algún motivo misterioso, onClick no se ejecutará para una RatingBar.

5

Andrew, sólo puede tratar para usar otro evento disponible para RatingB ar, OnRatingBarChangeListener. Mira este ejemplo, ¡funciona para mí!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

     @Override 
     public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
      viewMarketDetails(mContext); 
      dialog.dismiss(); 
     } 
    }); 

Así que no es necesario utilizar el OnClickEvent pero tiene el mismo efecto, pero sólo el trabajo, por supuesto, si cambia realmente el valor. (Si hace clic en el valor real, si no tiene ningún efecto)

4
ratingBar1.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

     @Override 
     public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 

      String rateValue = String.valueOf(ratingbar1.getRating()); 
      System.out.println("Rate for Module is"+rateValue); 
     } 
    });