从应用框架AF角度看ListView和Adapter by 高焕堂

在Android应用框架(Application Framework, 简称AF)里已经设计了许多类别,其中的
三个类别如下:
(图)高焕堂讲义之十五:从应用框架角度看ListView与Adapter类别

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

(图)高焕堂讲义之十五:从应用框架角度看ListView与Adapter类别

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

(图)高焕堂讲义之十五:从应用框架角度看ListView与Adapter类别

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程序员的见解:

(图)高焕堂讲义之十五:从应用框架角度看ListView与Adapter类别

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

(图)高焕堂讲义之十五:从应用框架角度看ListView与Adapter类别

于此,请看一个简单的Android程序代码,来体会上述智慧会合的实现。此程序的画面显示一个单纯的文字List窗口:

(图)高焕堂讲义之十五:从应用框架角度看ListView与Adapter类别

其程序代码如下:

   
 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();   
     }   
  }   
   
  
   
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等等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值