2012-07-31 61 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