android学习日记16--GridView(网格视图)

一、GridView

1、简述  

  GridView按照行列来显示图片或文本的一种视图,排列其实有点类似TableLayout布局,

不过和TableLayout还是差别很大的,倒比较像二维的ListView。位于android.widget包下,常常用来实现类似九宫格的图像。
实现手法和ListView有点相似,用Apapter把数据绑定到控件上,为容器提供子视图,利用视图的数据和元数据来构建每个子视图自定义Adapter显示。
如果需要自定义适配器 可以扩展抽象类BaseAdapter。

2、常用属性和对应方法如下:

下面用实例化SimpleAdapter和继承抽象类BaseAdapter方法实现下图的例子:


3、实例化SimpleAdapter实现

 Activity代码:

 1     private GridView gv; 
 2     @Override
 3     protected void onCreate(Bundle savedInstanceState) { 
 4        // TODO Auto-generated method stub 
 5        super.onCreate(savedInstanceState); 
 6        setContentView(R.layout.gridview); 
 7 
 8        //准备要添加的数据条目 
 9        List<Map<String, Object>> items = new ArrayList<Map<String,Object>>(); 
10        for (int i = 0; i < 9; i++) { 
11          Map<String, Object> item = new HashMap<String, Object>(); 
12          item.put("imageItem", R.drawable.ic_launcher);//添加图像资源的ID   
13          item.put("textItem", "icon" + i);//按序号添加ItemText   
14          items.add(item); 
15        } 
16 
17       //实例化SimpleAdapter适配器 
18        SimpleAdapter adapter = new SimpleAdapter(this,  
19                                                    items,  
20                                                    R.layout.grid_item,  
21                                                    new String[]{"imageItem", "textItem"},  
22                                                    new int[]{R.id.image_item, R.id.text_item}); 
23 
24        
25        //获得GridView实例 
26        gv = (GridView)findViewById(R.id.mygridview); 
27        //为GridView设置适配器 
28        gv.setAdapter(adapter); 
29 
30     }

单个组件XML:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3    android:id="@+id/RelativeLayout1"
 4    android:layout_width="wrap_content"  
 5    android:layout_height="fill_parent"
 6    android:paddingBottom="6dip"
 7    >
 8    <ImageView  
 9       android:id="@+id/image_item"
10       android:layout_width="wrap_content"
11       android:layout_height="wrap_content"
12       android:layout_centerHorizontal="true"
13       android:src="@drawable/ic_launcher"
14       />
15    <TextView  
16       android:id="@+id/text_item"
17       android:layout_below="@+id/image_item"
18       android:layout_height="wrap_content"
19       android:layout_width="wrap_content"
20       android: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"
 3    android:layout_width="wrap_content"
 4    android:layout_height="wrap_content"
 5    >
 6    <GridView  
 7       android:id="@+id/mygridview"
 8       android:numColumns="3"
 9       android:gravity="center_horizontal"
10       android:layout_width="wrap_content"
11       android:layout_height="wrap_content"
12       android: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        
18       List<GridInfo> list = new ArrayList<GridInfo>();  
19        for (int i = 0; i < 9; i++) { 
20            list.add(new GridInfo("icon"+i));  
21        } 
22        
23        GridAdapter adapter = new GridAdapter(this);  
24        adapter.setList(list);

补上GridAdapter代码:

 1 public class GridAdapter extends BaseAdapter {  
 2       
 3     private class GridHolder {  
 4         ImageView appImage;  
 5         TextView appName;  
 6     }  
 7   
 8     private Context context;  
 9   
10     private List<GridInfo> list;  
11     private LayoutInflater mInflater;  
12   
13     public GridAdapter(Context c) {  
14         super();  
15         this.context = c;  
16     }  
17   
18     public void setList(List<GridInfo> list) {  
19         this.list = list;  
20         mInflater = (LayoutInflater) context  
21                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
22   
23     }  
24   
25     public int getCount() {  
26         // TODO Auto-generated method stub  
27         return list.size();  
28     }  
29   
30     @Override  
31     public Object getItem(int index) {  
32   
33         return list.get(index);  
34     }  
35   
36     @Override  
37     public long getItemId(int index) {  
38         return index;  
39     }  
40   
41     @Override  
42     public View getView(int index, View convertView, ViewGroup parent) {  
43         GridHolder holder;  
44         if (convertView == null) {     
45             convertView = mInflater.inflate(R.layout.grid_item, null);     
46             holder = new GridHolder();  
47             holder.appImage = (ImageView)convertView.findViewById(R.id.image_item);  
48             holder.appName = (TextView)convertView.findViewById(R.id.text_item);  
49             convertView.setTag(holder);     
50   
51         }else{  
52              holder = (GridHolder) convertView.getTag();     
53   
54         }  
55         GridInfo info = list.get(index);  
56         if (info != null) {     
57             holder.appName.setText(info.getName());  
58         }  
59         return convertView;  
60     }
61 
62 }

比较麻烦还是重写getView()方法。里面的GridInfo只是普通的JAVA bean类。

原文地址:https://www.cnblogs.com/aiguozhe/p/3604006.html