2010-08-11 88 views
1

我有一个ListActivityListView中的每个项目都包含一个RatingBar。当用户操纵RatingBar时,我想更新连接到适配器的相应数据。更改适配器数据

不幸的是,在我的RatingBar处理程序中,我无法引用位置变量。我明白为什么。我只是无法找到解决办法。

我该如何处理我在这里要做的事情?

@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

任何人有任何其他想法? – Andrew 2010-08-12 14:11:29

回答

0

这里是我做了什么......

里面的onRatingChanged处理程序,我们首先需要找到位置。我创建了一个小方法来做到这一点:

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

其余的很简单。采取这种方法(x)的结果并致电:

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

我明白你的代码是不工作给你的一个错误:

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

试着这样做:

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

感谢您的回复。这对我不起作用。当我调试处理程序时,它说position2无法解析。 – Andrew 2010-08-11 21:21:43

0

怎么是这样的:

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

虽然,我可能会添加RatingBar.OnRatingBarChangeListener接口到实例化一次的另一个对象。 (即使是适配器,如果你想要的话,尽管它可能不属于那里)。实际上,你正在为每个RatingBar创建一个新的侦听器对象,并且在内存部门有点浪费。

+0

有人发布此解决方案,然后删除解决方案,一旦我提出了我的问题。我的问题是我的列表可以被用户改变(例如:删除一行)。这会混淆删除行下面的行的所有索引。也许在这个IF语句中添加ELSE case并更新标签会有所帮助,但显然只有当行进入视图时才会发生。有可能会导致奇怪的行为。 – Andrew 2010-08-13 13:52:22

+0

我认为标记实际上只在使用行的ID时才有用,因为它与它后面的数据有关。使用索引变得有问题。 – Andrew 2010-08-13 13:56:43