我有一个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中的项目数,但这没有帮助我设置单个细胞的背景颜色。
我接下来的任何想法?
答案 0 :(得分:8)
解决此问题的关键是首先了解ListView
和GridView
的工作原理。当您向上和向下滚动时,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);