Grid View
GridView是一个ViewGroup,它将所包含的组件显示在一个可滚动的二维网格里。网格中的组件会被自动插入到一个使用ListAdapter的布局中。、
关于如何使用适配器(adapter)动态地插入视图,请查看Building Layouts with an Adapter。
示例:
在本教程中,你将创建一个网格形式的图像缩略图。当选择其中某一项时,将显示出图像的位置。
1、创建一个新的工程,名称为HelloGridView。
2、找一些你喜欢的照片或者图片来使用。将保存到工程的 res/drawable 目录中。
3、打开 res/layout/main.xml 文件,然后拷贝粘贴下面的代码:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
GridView将充满整个屏幕。有些属性从字面意思就可以理解是干什么的了。关于有效属性的更多信息,请参考GridView。
4、打开HelloGridView.java文件,把下面的代码添加到onCreate()方法里:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
}
在设置了布局为main.xml布局之后,使用findViewById(int)从布局中获得了GridView。setAdapter()方法随后设置一个自定义的适配器(ImageAdapter)作为所有项目将显示在该网格中源。在下一步中,我们将创建ImageAdapter。
为了响应网格中组件被点击这一事件,一个新AdapterView.OnItemClickListener被作为参数传递给setOnItemClickListener()方法。这种匿名的实例定义了onItemClick()回调方法来显示所选择的物品的索引位置(从零开始的)。在现实应用场景中,这个位置可以被用来为其他一些处理任务获得完整的图像。
5、创建一个新的类,名称为ImageAdapter,继承自BaseAdapter:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7
};
}
首先,实现了一些需要从BaseAdapter继承的方法。构造函数和getCount()都是不言而喻的(必须实现)。通常,getItem(int)应该返回适配器中特定位置的那个实际的对象,但在这个例子中它忽略了。同样,getItemId(int)应该返回的组件的行号,这里也不需要。
第一个必要的方法是getView()。这个方法为每一个图像创建一个新的视图,添加到ImageAdapter里。当这个方法被调用时,一个视图被传递进来。这通常是一个可回收的对象(至少在这之后被称为一次)。所以,有一个检查,此对象是否为null。如果它是空的,一个ImageView就被实例化,并且配置图像表示所需要的属性:
- 使用setLayoutParams(ViewGroup.LayoutParams)为视图设置高度和宽度。这样做保证了,不论大小如何,每个图像都调整大小和剪裁来适应这样的尺寸。
- 使用setScaleType(ImageView.ScaleType)来声明图片应该居中显示(如果需要的话)。
- 使用setPadding(int,int,int,int)来定义为四边的空白填充。(注意,如果图像有不同的纵横比,然后少会导致更多的填充物裁剪图像如果它不匹配维度给ImageView。)
如果传递给getView()的视图不是null,那么本地ImageView将使用一个可回收的视图对象来进行初始化。
在getView()方法的最后,整型变量position作为参数传递进来,用于从mThumbIds数组中选择一个图像,它设置为ImageView的图像资源。
剩下的是定义可绘资源的mThumbIds数组。
6、运行程序。
试着通过调整GridView和ImageView元素的属性,来验证它们有何行为。例如,不使用setLayoutParams(ViewGroup.LayoutParams),而使用setAdjustViewBounds(boolean)。