2012-07-31 54 views
0

我创建了一个自定义CursorAdapter它通过bindView()结合在SQLdatabaseListView一些列的一些视图中的项目(一TextViewRatingBar),即:如何迭代Android ListView以获得RatingBar值?

public class MyCursorAdapter extends CursorAdapter { 
    ... 

    public void bindView(View view, Context context, final Cursor cursor) { 
     TextView name = (TextView)view.findViewById(R.id.name); 
     name.setText(cursor.getString(cursor.getColumnIndex(MyDbAdapter.KEY_NAME))); 
     RatingBar rating = (RatingBar)view.findViewById(R.id.life_bar_rating); 
     rating.setRating(cursor.getFloat(cursor.getColumnIndex(MyDbAdapter.KEY_RATING_VALUE))); 
    } 

    ... 
} 

我想要得到的绝对是最新版的所有RatingBar评分值,所以我可以相应地更新database(一气呵成)。我最初试图在我的CursorAdapter中使用cursor,但是我注意到cursor只包含database中存储的值,而不是最新的用户更改 - 这是预期的(文档有点模糊)?

我猜我需要以某种方式遍历实际视图 - 我将如何遍历我的ListView以检索所有新的评分栏评分值?

回答

1

您也可以让你的CursorfinalonBindView(),在你CursorAdapter

public class MyCursorAdapter extends CursorAdapter implements RatingBar.OnRatingBarChangeListener { 

    public void bindView(View view, Context context, final Cursor cursor) { 
     ... 
     rating.setTag(cursor.getPosition()); 
     rating.setOnRatingBarChangeListener(this); 
     ... 
    } 

    @Override 
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromTouch) { 
     Integer position = (Integer) ratingBar.getTag(); 
     Cursor c = getCursor(); 
     c.move(position); 
     int id = cursor.get id; 
     mRatings.add(id, rating); 
    } 

创建领域HashMap<id, rating> mRatings;,以后你穿越mRatings和更新在一个事务中改变评级。

+0

非常感谢您的帮助。如何获得评级栏的正确游标行ID?当我尝试从作为参数传入的游标获取行ID到bindView时,我只获取最后绑定ratingBar的行ID。 – Mewzer 2012-07-31 14:05:43

+1

其实,确定。我只是意识到我可以设置一个标签,稍后在RatingBar上检索标签。 – Mewzer 2012-07-31 14:12:09

+1

编辑帖子,当你找到方法时,我也建议你的Adapter实现'OnRatingBarChangeListener',所以你不需要为每个'RatingBar'创建一个新的并且节省内存。 – biegleux 2012-07-31 14:19:10

1

是的,这是预期的,因为当调用bindView()时,您正在从数据库检索值并更新RatingBar

因此,当用户更改值时,您必须分别更新每个评级栏的数据库。所以你必须设置一个OnRatinBarChangedListener

rating.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 
    public void onRatingChanged(RatingBar ratingBar, float rating, 
     boolean fromUser) { 

     if(fromUser){ 
      //update value here 
     }      

    } 
}); 

请注意,我们正在检查变更是否FROMUSER以免触发每bindView()通话监听器。

+0

谢谢! - 每次用户更改评级栏值时更新数据库都可以吗?这会不会影响手机中的闪存(因为我认为它有一定数量的读写)? – Mewzer 2012-07-31 13:21:36

+1

我不是硬件专家,但我不认为它会。想象一下聊天应用程序和它所做的大量读取/写入... – 2012-07-31 13:25:49