2010-08-09 43 views
18

我有一个ListView使用不同的XML文件来创建视图并使项目。其中一个XML文件包含一个RatingBar。一切都显示,看起来很棒。RatingBar onClick

我想附加一个onClick处理程序到RatingBar来启动一个新的活动。我的评分栏是风格?android:attr/ratingBarStyleSmall;所以它只是一个指标(我希望小规模的评级栏点击让用户进入一个活动,他们可以做各种评级)。

我的问题是RatingBar的onClick处理程序永远得不到执行。更令人感兴趣的是,我使用相同的代码来使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使用相同的代码,并且工作正常。我的评级栏设置为可点击。我在LinearLayout和RatingBar的onClick监听器中设置了断点,并且只有LinearLayout处理程序被执行。注意:RatingBar不在LinearLayout中。如您所见,它们位于两个不同的XML文件中。 – Andrew 2010-08-11 18:13:27

回答

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

HTH, 乔纳斯

1

在ListView,你通常必须决定是否要在列表视图项目可以点击,或项目包含在列表视图中。 r.isClickable()是否返回true?

在RatingBar上,您可能有更好的运气设置可点击为false,而是使用listView的onClickListener来处理listView行上的点击事件。

+0

我不希望整个列表项是可点击的,但我希望列表项中的单个项目可点击。我已经使用LinearLayout项目实现了这一点。代码完全相同,onClick处理程序完美执行。我不明白为什么RatingBar不会。我会更新我的主帖以反映这一点,1时刻 – Andrew 2010-08-09 21:11:00

4

我已经绕过这个问题了,通过在LinearLayout中包装RatingBar并将onClick监听器附加到LinearLayout。我不喜欢这样做,但它有效。由于一些神秘的原因onClick不会执行RatingBar。

5

安德鲁,你可以试试使用另一个可用的活动RatingB arOnRatingBarChangeListener。看到这个例子,它适合我!

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