视图组件也有运行时创建和在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的基本方式。
因为比较简单,并且源码大多已经展示,如果需要源码可以给我留言。