一、GridView
1、简述
GridView按照行列来显示图片或文本的一种视图,排列其实有点类似TableLayout布局,
不过和TableLayout还是差别很大的,倒比较像二维的ListView。位于android.widget包下,常常用来实现类似九宫格的图像。
实现手法和ListView有点相似,用Apapter把数据绑定到控件上,为容器提供子视图,利用视图的数据和元数据来构建每个子视图自定义Adapter显示。
如果需要自定义适配器 可以扩展抽象类BaseAdapter。
2、常用属性和对应方法如下:
下面用实例化SimpleAdapter和继承抽象类BaseAdapter方法实现下图的例子:
3、实例化SimpleAdapter实现
Activity代码:
1private GridView gv;
2@Override
3protected void onCreate(Bundle savedInstanceState) {
4// TODO Auto-generated method stub
5super.onCreate(savedInstanceState);
6setContentView(R.layout.gridview);
7
8//准备要添加的数据条目
9List<Map<String, Object>> items = new ArrayList<Map<String,Object>>();
10for (int i = 0; i < 9; i++) {
11Map<String, Object> item = new HashMap<String, Object>();
12item.put("imageItem", R.drawable.ic_launcher);//添加图像资源的ID
13item.put("textItem", "icon" + i);//按序号添加ItemText
14items.add(item);
15}
16
17//实例化SimpleAdapter适配器
18SimpleAdapter adapter = new SimpleAdapter(this,
19items,
20R.layout.grid_item,
21new String[]{"imageItem", "textItem"},
22new int[]{R.id.image_item, R.id.text_item});
23
24
25//获得GridView实例
26gv = (GridView)findViewById(R.id.mygridview);
27//为GridView设置适配器
28gv.setAdapter(adapter);
29
30}
单个组件XML:
1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3android:id="@+id/RelativeLayout1"
4android:layout_width="wrap_content"
5android:layout_height="fill_parent"
6android:paddingBottom="6dip"
7>
8<ImageView
9android:id="@+id/image_item"
10android:layout_width="wrap_content"
11android:layout_height="wrap_content"
12android:layout_centerHorizontal="true"
13android:src="@drawable/ic_launcher"
14/>
15<TextView
16android:id="@+id/text_item"
17android:layout_below="@+id/image_item"
18android:layout_height="wrap_content"
19android:layout_width="wrap_content"
20android:layout_centerHorizontal="true"
21/>
22 </RelativeLayout>
页面主布局XML:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3android:layout_width="wrap_content"
4android:layout_height="wrap_content"
5>
6<GridView
7android:id="@+id/mygridview"
8android:numColumns="3"
9android:gravity="center_horizontal"
10android:layout_width="wrap_content"
11android:layout_height="wrap_content"
12android:stretchMode="columnWidth"
13/>
14 </LinearLayout>
4、继承抽象类BaseAdapter实现
替换成自己GridAdapter代码:
1 ////准备要添加的数据条目
2 //List<Map<String, Object>> items = new ArrayList<Map<String,Object>>();
3 //for (int i = 0; i < 9; i++) {
4 //Map<String, Object> item = new HashMap<String, Object>();
5 //item.put("imageItem", R.drawable.ic_launcher);//添加图像资源的ID
6 //item.put("textItem", "icon" + i);//按序号添加ItemText
7 //items.add(item);
8 //}
9 //
10 ////实例化SimpleAdapter适配器
11 //SimpleAdapter adapter = new SimpleAdapter(this,
12 //items,
13 //R.layout.grid_item,
14 //new String[]{"imageItem", "textItem"},
15 //new int[]{R.id.image_item, R.id.text_item});
16
17
18List<GridInfo> list = new ArrayList<GridInfo>();
19for (int i = 0; i < 9; i++) {
20list.add(new GridInfo("icon"+i));
21}
22
23GridAdapter adapter = new GridAdapter(this);
24adapter.setList(list);
补上GridAdapter代码:
1 public class GridAdapter extends BaseAdapter {
2
3private class GridHolder {
4ImageView appImage;
5TextView appName;
6}
7
8private Context context;
9
10private List<GridInfo> list;
11private LayoutInflater mInflater;
12
13public GridAdapter(Context c) {
14super();
15this.context = c;
16}
17
18public void setList(List<GridInfo> list) {
19this.list = list;
20mInflater = (LayoutInflater) context
21.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
22
23}
24
25public int getCount() {
26// TODO Auto-generated method stub
27return list.size();
28}
29
30@Override
31public Object getItem(int index) {
32
33return list.get(index);
34}
35
36@Override
37public long getItemId(int index) {
38return index;
39}
40
41@Override
42public View getView(int index, View convertView, ViewGroup parent) {
43GridHolder holder;
44if (convertView == null) {
45convertView = mInflater.inflate(R.layout.grid_item, null);
46holder = new GridHolder();
47holder.appImage = (ImageView)convertView.findViewById(R.id.image_item);
48holder.appName = (TextView)convertView.findViewById(R.id.text_item);
49convertView.setTag(holder);
50
51}else{
52holder = (GridHolder) convertView.getTag();
53
54}
55GridInfo info = list.get(index);
56if (info != null) {
57holder.appName.setText(info.getName());
58}
59return convertView;
60}
61
62 }
比较麻烦还是重写getView()方法。里面的GridInfo只是普通的JAVA bean类。