您的位置:首页 > 其它

从应用框架角度看ListView与Adapter类别

2011-08-10 15:15 369 查看
从应用框架角度看ListViewAdapter类别
在Android应用框架(Application Framework, 简称AF)里已经设计了许多类别,其中的
三个类别如下:

图1 AF里的类别
这用来协助Activity在UI画面上显示一个List窗口,例如:


图2 应用程序(1) 图3 应用程序(2)
请你注意AF的特性:Activity、ListView和BaseAdapter两个类别已经由Android AF开发者设计在先。只是当时Android AF开发者并不知道应用程序(Applications, 简称AP)里的List窗口的内容,所以预留了空间给AP程序员去补充,如下:

图4 应用程序员的工作
AF设计师与AP程序员两者在不同的时间及空间(即地点)合作。AF设计师在设计AF当时并不知道AP的List窗口里各选项的长相(文字或是图像等),因为这长相的决定是来自于AP的用户。所以只有AP程序员知道,AF设计师并不知道。于是,AF设计师负责撰写AF里的Super-class(如BaseAdapter)而AP程序员负责撰写AP里的Subclass(如myStringAdapter)。两者跨时间和空间的智能会合而成为一支完整好用的应用程序。例如,AP程序员知道他的UI将显示出单纯的文字型List窗口,所以就撰写myStringAdapter子类别。
当应用程序执行时,AF掌握整个控制权,呼叫ac01的onCreate()函数,询问AP程序员的见解:

图5 AF向AP询问
在ac01的onCreate()函数里,AP程序员回答:由myStringAdapter子类别来提供内容及长相给ListView。于是,Activity要求显示ListView的内容时,ListView就从BaseAdapter而反向呼叫到myStringAdapter的getView()等函数,而取得显示的内容和长相了。


图6 AF 依据AP的响应而具有完整的执行路线
于此,请看一个简单的Android程序代码,来体会上述智慧会合的实现。此程序的画面显示一个单纯的文字List窗口:

其程序代码如下:
/* ac01.java */
package xom.misoo.pkzz;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class ac01 extends Activity implements OnItemClickListener {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

ListView lv = new ListView(this);
lv.setAdapter(new myAdapter(this));
lv.setOnItemClickListener(this);
setContentView(lv);
}

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if(arg2 == 0)
setTitle(((TextView)arg1).getText());
else if(arg2 == 1)
finish();
}
}
/* myAdapter.java */
package xom.misoo.pkzz;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class myAdapter extends BaseAdapter {
private Context ctx;
private ArrayList<String> coll;

public myAdapter(Context context) {
ctx = context;
coll = new ArrayList<String>();
coll.add("Hello!!");
coll.add("Exit");
}
public int getCount() {
return coll.size();
}
public Object getItem(int position) {
return coll.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv;
if (convertView == null)
tv = new TextView(ctx);
else
tv = (TextView)convertView;
tv.setTextColor(Color.CYAN);
tv.setHeight(45);
tv.setTextSize(26);
tv.setText(coll.get(position));
return tv;
}
}
其于,这样的基本结构,就能进一步发展出各式各样的Adapter了。例如ArrayAdapter、SimpleAdapter等等。于此,只节录讲义的前段基础部份,至于后段的应用部分,就省略之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息