2012-10-14 183 views
9

我有一個GridView,每個單元格包含一些文本,我希望能夠設置單個單元格的背景顏色。如何設置單個gridview單元格的背景顏色

我的GridView的XML是:

<GridView android:id="@+id/students_grid" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:numColumns="6" 
      android:gravity="center" 
      android:stretchMode="columnWidth"> 
</GridView> 

我的GridView的代碼是:

GridView gridView = (GridView) findViewById(R.id.students_grid); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, student_array); 
gridView.setAdapter(adapter); 

我希望我能設置使用單個細胞的背景色:

gridView.getChildAt(random_student).setBackgroundColor(Color.parseColor("#18A608")); 

但是,這會拋出一個空指針異常,在進一步的檢查看來,似乎gridv iew.getChildCount()返回0.我已經看到gridview.getCount正確地返回gridview中的項目數,但這並不能幫助我設置單個單元格的背景顏色。

任何想法,我下一個去哪裏?

回答

-1

您需要創建自定義佈局並將其用於適配器而不是android.R.layout.simple_list_item_1。例如:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" 
    android:paddingRight="?android:attr/listPreferredItemPaddingRight" 
    android:minHeight="?android:attr/listPreferredItemHeightSmall" 
    android:background="#18A608" 
    /> 

(我只是複製了最新版本的simple_list_item_1.xml並在末尾添加新的背景顏色。)

保存此爲res/layoutgrid_layout.xml和更改適配器的構造函數:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.grid_layout, student_array); 
+0

謝謝。這適用於在創建屏幕時初始化所有單元格。 但我也需要動態訪問和更改單元格。有沒有辦法在運行時引用單個單元格以更改其顏色? –

+0

(對不起,我剛剛找到你的答案。)是的,但是你想突出顯示一個細胞還是與標準相匹配的每個細胞(如每三個細胞或每個失敗的學生)? – Sam

+0

@Mark__C是的,如SDK中建議的覆蓋BaseAdapter。 – dcow

7

解決此問題的關鍵是首先了解ListViewGridView如何工作。 GridView在您上下滾動時創建並銷燬子視圖。如果您在GridView中看不到某個項目,表示該項目沒有子視圖,則會在用戶實際滾動時創建該項目。 GridView使用Adapter來創建視圖,並且GridView在屏幕離開時回收視圖,並要求適配器重新使用屏幕上顯示的新視圖的回收視圖。 Adapter通常會膨脹資源佈局以創建新視圖。

那麼這意味着GridView將在Adapter上調用getView(...)每次它想要在屏幕上顯示子視圖時,它可能會傳遞一個稱爲convertView的回收視圖。

的解決方案是重寫getView(...),調用super讓Adapter創建和填充從String陣列數據視圖正常,但在末尾添加一段代碼,我們給視圖回GridView,設置顏色之前的看法。

new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, student_array) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 

    int color = 0x00FFFFFF; // Transparent 
    if (someCondition) { 
     color = 0xFF0000FF; // Opaque Blue 
    } 

    view.setBackgroundColor(color); 

    return view; 
    } 
}; 
3

,你必須創建的十六進制顏色代碼數組,並通過自定義適配器類

public class MainActivity extends Activity { 
GridView gridView; 


    String[] gridColor ={ 

      "#008B8B", 
      "#00FF00", 
      "#48D1CC", 
      "#556B2F", 
      "#696969", 
      "#6B8E23", 
      "#8FBC8F", 
      "#AFEEEE", 
      "#B8860B", 
      "#BDB76B", 
      "#D8BFD8", 
      "#DEB887", 
      "#FFFF00", 
      "#FFF0F5", 
      "#EE82EE", 
      "#DC143C", 
      "#C0C0C0" 
    }; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Grid adapter = new Grid(MainActivity.this,gridColor); 
     gridView=(GridView)findViewById(R.id.grid_view); 

     gridView.setAdapter(adapter); 


     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) 
      { 
       Toast.makeText(MainActivity.this, "You Clicked On " +gridcolor[+ position], Toast.LENGTH_SHORT).show(); 

      } 
     }); 

    } 

} 

在定製適配器代碼會是這樣,其中的顏色代碼將被解析主要活動

public class Grid extends BaseAdapter { 

    private Context mContext; 
    private final String[] menu; 
    private final int[] Imageid; 
    private final String[] gridcolor; 

    public Grid(Context context,String[] menu,int[] Imageid,String[] gridcolor) 
    { 
     mContext=context; 

     this.gridcolor=gridcolor; 
    } 

    @Override 
    public int getCount() { 
     return gridcolor.length; 
    } 

    @Override 
    public Object getItem(int i) { 
     return null; 
    } 

    @Override 
    public long getItemId(int i) { 
     return 0; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     View grid; 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (view == null) { 

      grid = new View(mContext); 
      grid = inflater.inflate(R.layout.grid_layout, null); 

      grid.setBackgroundColor(Color.parseColor(gridcolor[i])); 

     } else 
     { 
      grid = view; 
     } 

     return grid; 
    } 
} 
相關問題