2011-05-02 45 views
0

我試圖創建從我的SQLite數據庫中生成的信息。我目前的代碼設置爲僅顯示每行,並使用數據填充3個文本視圖。我希望能夠使用某種If語句來檢查其中一個值是否爲「Room1」,然後將該行的背景設置爲某種顏色。如何使用SimpleCursorAdapter更改特定行的背景

這樣,列表中的每一行將根據數據的「房間」而有不同的背景。

我已經嘗試過擴展SimpleCursorAdapter,但我有點失去了如何得到我想要的東西。

這裏是我目前的SimpleCursorAdapter:

Cursor notesCursor = myDbHelper.fetchDayPanelNotes(type, day); 
startManagingCursor(notesCursor); 
String[] from = new String[]{DataBaseHelper.KEY_NAME, DataBaseHelper.KEY_ROOM, DataBaseHelper.KEY_TIME}; 

int[] to = new int[]{R.id.text1, R.id.text2, R.id.text3}; 

SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.main_row, notesCursor, from, to); 
setListAdapter(notes); 

回答

0

我會建議延長BaseAdapter,手動填充您的列表數據並在適配器類中保留該數據的本地副本。然後,當您實施getView(...)方法時,您可以使用您生成的View的位置或ID來獲取相應數據以檢查「Room1」,並根據該比較更改您返回的View

rekaszeru的回答完全是正確的想法,但它聽起來像需要比位置和ID更多的信息,這就是爲什麼我建議降低水平並直接實施BaseAdapter

+0

爲了將交替的行顏色設置爲「ListView」,知道數據提供者中項目的位置就足夠了(除了要設置的顏色外)...... – rekaszeru 2011-05-02 19:36:02

+1

這是真的。但這不是問題的目標。 「根據數據的」房間「是什麼,列表中的每一行都會有不同的背景。」 – LeffelMania 2011-05-02 19:43:24

+0

對,我忘記了這一點。 – rekaszeru 2011-05-02 19:53:11

9

,你應該重寫你的適配器的getView方法:

SimpleCursorAdapter notes = new SimpleCursorAdapter(
     this, R.layout.main_row, notesCursor, from, to) 
{ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     final View row = super.getView(position, convertView, parent); 
     if (position % 2 == 0) 
      row.setBackgroundResource(android.R.color.darker_gray); 
     else 
      row.setBackgroundResource(android.R.color.background_light); 
     return row; 
    } 
}; 

,並設置該行的基於位置的背景(是奇數還是偶數)。

+0

使用這種方法只是爲了測試可能顯示了一些奇怪的事件。該列表填充正確,每行交替的顏色,但只要我開始滾動,所有行成爲darker_grey顏色,即使我回滾了。只要我重新加載頁面,它就會正確顯示它們,直到我滾動。任何想法爲什麼發生這種情況? – Tag 2011-05-02 19:26:14

+1

是的。無論如何你需要設置背景顏色,所以你還需要else子句。這些行視圖是循環使用的,每次佈置時都不會創建,所以如果以前用作偶數項目渲染器,現在很奇怪,您必須將其設置爲適當的背景。 – rekaszeru 2011-05-02 19:33:01

+0

當然,不要檢查行是奇數還是偶數位,您需要檢查它是否爲'Room1'。 – rekaszeru 2011-05-02 19:54:36

1

我實現了我的活動SimpleCursorAdapter.ViewBinder然後覆蓋setViewValue ...

public class MyActivity extends Activity 
    implements SimpleCursorAdapter.ViewBinder { 

    SimpleCursorAdapter myAdapter = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState) 

     // Initialize myAdapter 
     myAdapter.setViewBinder(this); 
    } 

    @Override 
    public boolean setViewValue(View view, Cursor cursor, int column) { 
     // Put code to process row data here 
    } 
} 
+0

這不起作用,因爲通常情況下你不想改變單個單元的背景,但整個行。細胞可以在高度上有所不同,這使得這個解決方案看起來很雜亂重寫getView()更好。 – cdonner 2012-02-24 18:54:34

+0

看看我用「我執行......」開始我的答案,這正是我的意思。我在回答問題時正在開發的應用在左側有一個'正方形'的'TextView',它以'HH:mm'格式顯示時間,但'Cursor'以ISO8601格式提供時間。那個方形的'TextView'也必須有一個默認的黑色背景或者有時是橙色的,有時是紅色的。右邊是1或2個其他'TextViews'垂直堆疊(取決於用戶偏好)。那些'TextViews'也有動態更改。 'setViewValue'在我的情況下效果最好。畢竟這只是一個建議。 – Squonk 2012-02-24 19:03:12

2

這應該這樣做。 多虧了這個帖子,我有完全一樣的問題,但通過這個打算後,問題就解決了,如下圖所示,

SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to) 
    { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      cursor.moveToPosition(position); 
      String s = cursor.getString(mursor.getColumnIndex("roomnumber")); 
      final View row = super.getView(position, convertView, parent); 

      if (s.equalsIgnoreCase("room1")) 
       row.setBackgroundColor(Color.parseColor("#480000")); 
      else if (s.equalsIgnoreCase("room2")) 
       row.setBackgroundColor(Color.parseColor("#000040")); 
      else 
       row.setBackgroundColor(Color.parseColor("#004000")); 
      return row; 
     } 
    };  


    setListAdapter(notes); 
相關問題