视图组件也有运行时创建和在xml定义两种途径,在android常用的视图中有一个比较重要的类,AdapterView适配器视图,适配器视图就是用适配器(Adapter)将视图和该视图所依赖的数据链接起来。在这里用一个继承自BaseView的GridView来分析一下。

  首先在xml文档中定义GridView.

<?xml version="1.0" encoding="utf-8"?>
  <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnWidth="150dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="5dp"
    android:horizontalSpacing="5dp"
    android:stretchMode="columnWidth"
    android:gravity="center" />



 

Android 中app或者widget UI的定义都是有两种方式:1.在xml中定义。 2 运行时加载也就是在代码中定义。这里应用xml定义。

  接下来是Activity的实现。

  

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainview);
        ImageGridAdapter adapter = new ImageGridAdapter(this);
        GridView mGridView = (GridView) findViewById(R.id.gridview);
        mGridView.setAdapter(adapter);
        mGridView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
            }
            
        });
    }

 

这里ImageGridAdapter是我们自己定义的一个Adapter,用来实现联系的桥梁。setOnItemClickListener()给GridView 设置一个点击监听器。当用户点击每个图标时会做出相应的动作。这种视图中最关键的就是我们自己定义的适配器。

  实现ImageGridAdapter的具体如下:

  

public ImageGridAdapter(Context context) {
        // TODO Auto-generated constructor stub
        this.mContext = context;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return IConfig.IMGS.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ImageView iv = null;
        if(convertView ==null){
            iv = new ImageView(mContext);
            iv.setAdjustViewBounds(true);
            iv.setLayoutParams(new GridView.LayoutParams(150,150));
            iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
            iv.setPadding(1, 100, 1, 1);
        }else{
            iv = (ImageView)convertView;
        }
        iv.setImageResource(IConfig.IMGS[position]);
        return iv;
    }

  继承BaseAdapter实现自己的适配器,主要要实现4个函数。

  首先getCount() 表示我们将要在适配器中展示多少个数据,这个函数必须重置,如果返回0,则不会有任何数据出现。本例中IConfig是一个接口,IMGS是一个整形数组,内容是drawable下图片的ID。因为此例主要是展示一些图片的GridView。

  其次 getItem(int position) 返回固定位置上的对象,要明白的是你展示的是什么数据,此函数返回的就是什么类型。只是因为java是单根继承所以在此返回值是Object。如果要应用此函数必须清楚返回的类型。

  再次 getItemId() 返回具体位置data的ID,没有什么疑问。

  最重要的就是getView()这个函数设置了展示的内容的具体属性(包括位置,大小等等),当这个函数被framework调用时,View才被传入。首先positon表示数据的位置。convertView 要展示的对象,因为这个对象有时侯会被回收,所以在程序中必须判断是否为空。如果为空时我们就要自己定义要展示的具体内容。本例中就是对ImageView进行设置。如果不为空则直接赋值。然后返回所要展示的对象(一个View)。

  这就是通过BaseAdapter 创建自己adapter的基本方式。

  因为比较简单,并且源码大多已经展示,如果需要源码可以给我留言。