在上面代码中使用了一个GridAdapter类,该类用于向GridView对象提供数据,代码如下:
广州网站建设
- package mobile.android.ch06_ucweb.menu;
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.TextView;
- public class GridAdapter extends BaseAdapter
- {
- private Context mContext;
- private LayoutInflater mLayoutInflater;
- public GridAdapter(Context context)
- {
- mContext = context;
- mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_
- INFLATER_SERVICE);
- }
- @Override
- public int getCount()
- {
- return Const.GRID_ITEM_ICON_ID_LIST.length;
- }
- @Override
- public Object getItem(int position)
- {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public long getItemId(int position)
- {
- return 0;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent)
- {
- // 此方法返回一个包含ImageView和TextView的View对象
- if (convertView == null)
- convertView = mLayoutInflater.inflate(R.layout.grid_item, null);
- ImageView ivGridItemIcon = (ImageView) convertView
- .findViewById(R.id.ivGridItemIcon);
- TextView tvGridItemText = (TextView) convertView
- .findViewById(R.id.tvGridItemText);
- // 设置在ImageView对象中显示的图像
- ivGridItemIcon.setImageResource(Const.GRID_ITEM_ICON_ID_LIST[position]);
- // 设置在TextView中显示的文本
- tvGridItemText.setText(Const.GRID_ITEM_TEXT_LIST[position]);
- return convertView;
- }
- }
在使用getView方法返回View对象时要注意,每一个View对象用于显示当前位置(position指定的位置)的内容,对于GridView来说,就是一个单元格。对于ListView来说,就是一个列表项。不过如果每一个单元格或列表项中的控件都一样的话(如本例每一个单元格都只有一个ImageView和TextView),并不需要总是创建新的View对象。getView方法有一个convertView参数,如果该参数不为null,则表示曾经创建的View对象。我们只需要获得这个View对象,并重新设置其中控件的值即可。从这一点可以看出,系统在创建每一个View对象后,并不会释放它们,而是将这些View对象保存了起来。当GridView或ListView进行滚动时,会将这些曾经创建的View对象再次传入getView方法,这样就可以重新利用这些View对象了。通过这种方式可以大大节省系统的资源(虽然Java有垃圾回收机制,但一般只有在系统资源快要耗尽时才会回收不需要的内存资源)。广州网站建设
本例还涉及一些图像文件,并且在Const类中定义了这些图像文件以及相对应的文本,以便在代码中使用它们。Const类的代码如下:
广州网站设计
- package mobile.android.ch06_ucweb.menu;
- public class Const
- {
- public final static int[] GRID_ITEM_ICON_ID_LIST = new int[]
- { R.drawable.intercept_list, R.drawable.intercept_rule, R.drawable.intercepted_
- record,
- R.drawable.location, R.drawable.incoming_and_outgoing_setting,
- R.drawable.privacy_manager, R.drawable.ip, R.drawable.dial,
- R.drawable.useful};
- public final static String[] GRID_ITEM_TEXT_LIST = new String[]
- { "拦截名单", "拦截规则","拦截记录" , "归属地查询", "来去电设置", "隐私管理", "IP电话设置", "
- 通讯记录", "常用号码"};
- }
除此之外,本例还涉及两个布局文件popup_window.xml和grid_item.xml,其中popup_window.xml用于弹出窗口的布局,grid_item.xml用于GridView对象中每一个单元格的布局。这两个布局文件的代码如下:
广州网站设计
- popup_window.xml
- <?xml version="1.0" encoding="utf-8"?>
- <GridView android:id="@+id/gvPopupWindow"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:gravity="center" android:padding="10dp" android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:horizontalSpacing="10px"
- android:verticalSpacing="10px" android:stretchMode="columnWidth"
- androidandroid:columnWidth="80dp"android:numColumns="auto_fit" android:background="@drawable/popup_window_border"/>
- grid_item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:gravity="center">
- <ImageView android:id="@+id/ivGridItemIcon"
- android:layout_width="50dp" android:layout_height="50dp" />
- <TextView android:id="@+id/tvGridItemText"
- android:layout_width="wrap_content" android:layout_height="wrap_content" android:
- textColor="#FFF" />
- </LinearLayout>
运行本程序,按下"menu"菜单,显示效果如图6.11所示。
![]() |
| 图6.11 模拟UCWeb的弹出菜单 |




