2012-10-14 186 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; 
    } 
} 
相关问题