从应用框架角度看ListViewAdapter类别

Android应用框架(Application Framework, 简称AF)里已经设计了许多类别,其中的

三个类别如下:

1  AF里的类别

这用来协助ActivityUI画面上显示一个List窗口,例如:

 

    2  应用程序(1)                    3  应用程序(2)

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

4  应用程序员的工作

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

     当应用程序执行时,AF掌握整个控制权,呼叫ac01onCreate()函数,询问AP程序员的见解:

5  AFAP询问

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

 

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了。例如ArrayAdapterSimpleAdapter等等。于此,只节录讲义的前段基础部份,至于后段的应用部分,就省略之。