grid view是一种viewgroup,它用两个维度显示对象,可以滚动的网格。网格的实体会自动使用ListAdapter插入到布局中。
翻阅一个介绍怎样使用adapter来动态插入views的介绍,请阅读Build Layouts with an Adapter。
在这个教程里面,你会创建一个图片的缩略图的grid。当一个item被选中的时候,一个toast消息会在图片的位置显示出来。
建立一个叫HelloGridView的新的工程。
找一些你想要使用的图片,或者下载一些示例图片。把它们保存在工程的res/drawable目录下。
打开/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="match_parent"
android:layout_height="match_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
GridView将会填充整个屏幕。这些属性基本都可以见名知道意思。更多的关于有效的属性,请看GridView的参考文档。
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布局被加载以后,GridView就可以通过findViewById进行获取了。setAdapter方法设置一个定制的adpter(ImageAdapter)作为所有的要在grid中显示的源。ImageAdapter将在下一步中被创建。
当grid被点击的时候,一个AdapterView.OnItemClickListener对象将会被传递到setOnItemClickListener。这个匿名的实例里面定义了一个显示一个Toast的方法,其中显示了点击的网格的从零开始 的坐标。在实际使用当中,会获取一个全尺寸的图片给其他任务。
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()方法应该返回一个在adapter指定位置的对象,但是在这例子里面被忽略了。类似的,getItemId()方法应该放回item所在的行的id。但是在这个例子里没有必要。
第一个必须要的方法是getView()。这个方法为每一个图片创建了一个加载的ImageAdapter中的view。当这个方法调用的时候,一个view被传进来,通常是一个循环的对象,(一般也至少被调用一次)。所以有一个检查是否为空的判断。如果为空的话,就实例化一个ImageView并适配一个的属性给要显示的图片。
setLayoutParameters(ViewGroup.LayoutParms)设定这个view的高和宽,这保证了无论drawaable的大小,每一个图像都视情况被重新定义大小,或者被裁剪来适应大小。
setScaleType(ImageView.ScaleType)声明了图像应该被向着中心裁剪(如果必要)。
setPadding(int,int,int,int)定义了所有边的填充padding。注意到,如果图片有不同的横纵比例,那么在填充较少的情况下,如果图像没有到达给定的imageView的大小,就更有可能被裁减。
如果传递给getView的view不是null,那么本地的ImageView就使用循环回收的view进行初始化。
在getView方法的默认,position整型数被传递到这个这个方法被用来从mThumbIds数组来选择图像,他们是ImageView的的图像资源。