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