2010-08-09 3 views
18

У меня есть ListView, который использует разные файлы XML для создания представлений и извлечения элементов из. Один из этих файлов XML содержит RatingBar. Все отображается и выглядит превосходно.RatingBar onClick

Я пытаюсь подключить обработчик onClick к RatingBar для запуска нового действия. Мой рейтингBar имеет стиль? Android: attr/ratingBarStyleSmall; так что это всего лишь индикатор (я хочу, чтобы маленький RatingBar щелкнул мышкой, чтобы перейти к Activity, где они могут выполнять различные оценки).

Моя проблема заключается в том, что обработчик onClick для RatingBar никогда не выполняется. Что делает его более интересным, так это то, что я использовал тот же код, чтобы сделать LinearLayout доступным для кликов, и он отлично работает. Может ли кто-нибудь сказать мне, почему?

GetView моего адаптера выглядит так:

@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

У кого есть дополнительные комментарии по этому вопросу? Я все еще не могу заставить обработчик onClick выполнить. Как вы можете видеть, я использую тот же код для LinearLayout, и он отлично работает. Мой RatingBar настроен на кликабельность. Я установил точки останова внутри слушателей onClick как для LinearLayout, так и для RatingBar, и выполняется только обработчик LinearLayout. Примечание: RatingBar НЕ находится внутри LinearLayout. Как вы можете видеть, они находятся в двух разных файлах XML. – Andrew

ответ

53

Причина setOnClickListener() не работает в том, что RatingBar переопределяет onTouchEvent() (на самом деле его супер класс, AbsSeekBar, делает), и никогда не давайте View заботиться о нем, так View#performClick() никогда не вызывается (который бы назвал OnClickListener).

Два возможных пути решения проблемы:

    вытекают из RatingBar и отменяют onTouchEvent()
    использовать OnTouchListener вместо этого, например, так:
     
    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; 
        } 
    

НТН, Jonas

1

В ListView, вы вообще должны решить, если вы хотите, чтобы просмотреть список пунктов, чтобы быть интерактивными, или элемент, содержащийся в ListView. Выполняет ли r.isClickable() значение true?

Возможно, у вас может быть более удачная установка с возможностью кликабельности на false в RatingBar, а вместо этого использование onClickListener в listView для обработки событий щелчка в строке listView.

+0

Я не хочу, чтобы элемент списка целиком мог быть доступен клиенту, но я хочу, чтобы отдельные элементы внутри элемента списка были доступны для клика. Я уже достиг этого с помощью элемента LinearLayout. Код точно такой же, и обработчик onClick отлично работает. Я не понимаю, почему RatingBar не делает. Я обновляю свой основной пост, чтобы отразить это, 1 минута – Andrew

4

Я взломал эту проблему, обернув RatingBar в LinearLayout и подключив прослушиватель onClick к LinearLayout. Мне не нравится это делать, но это работает. По какой-то загадочной причине onClick не будет выполняться для RatingBar.

5

Эндрю, вы можете просто попробовать использовать другое событие для RatingB ar, OnRatingBarChangeListener. Смотрите этот пример, он работает для меня!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

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

Так что вам не нужно использовать onClickEvent но иметь тот же эффект, но только работу, от курса, если вы измените значение на самом деле. (Если вы нажмете на фактическое значение, если не действует)

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); 
     } 
    });