如何设置各个gridview单元格的背景颜色

时间:2012-10-14 19:49:02

标签: android 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"));

但是,这会引发空指针异常,并且在进一步检查时,似乎gridview.getChildCount()返回0.我看到gridview.getCount正确返回gridview中的项目数,但这没有帮助我设置单个细胞的背景颜色。

我接下来的任何想法?

3 个答案:

答案 0 :(得分:8)

解决此问题的关键是首先了解ListViewGridView的工作原理。当您向上和向下滚动时,GridView会创建并销毁子视图。如果您在GridView中看不到某个项目,表示没有子视图,则会在用户实际滚动到该项目时创建该项目。 GridView使用Adapter创建视图,GridView在视频离开时回收视图,并要求适配器将重新使用的视图重新用于屏幕上显示的新视图。 Adapter通常会使资源布局膨胀以创建新视图。

这意味着GridView每次想要在屏幕上显示子视图时getView(...)都会调用Adapter,它可能会传递一个名为{{1的回收视图}}

解决方法是覆盖convertView,调用super以让getView(...)创建并使用Adapter数组中的数据正常填充视图,但最后添加一些代码我们将视图返回到设置视图颜色的String

GridView

答案 1 :(得分:3)

您必须创建十六进制颜色代码数组并传递给自定义适配器类的主要活动

<?php

    //Deal with the email
    $sender = $_POST['email'];

    $to = 'info@matinjewellery.com';
    $subject = $_POST['name'];

    $message = strip_tags($_POST['message']);
    $attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'])));
    $filename = $_FILES['file']['name'];

    $boundary =md5(date('r', time())); 

    $headers = "From: ".$sender."\r\nReply-To: ".$to;
    $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\"";

    $message="This is a multi-part message in MIME format.

 --_1_$boundary
Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

 --_2_$boundary
 Content-Type: text/plain; charset=\"utf-8\"
 Content-Transfer-Encoding: 7bit

 $message

 --_2_$boundary--
 --_1_$boundary
 Content-Type: application/zip; name=\"$filename\" 
 Content-Transfer-Encoding: base64 
 Content-Disposition: attachment 
 $attachment
 --_1_$boundary--";
mail($to, $subject, $message, $headers);    
?>

在自定义适配器代码中,将会解析颜色代码

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();

            }
        });

    }

}

答案 2 :(得分:-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并在最后添加了新的背景颜色。)

将此保存为grid_layout.xml res/layout并将适配器的构造函数更改为:

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