Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 自定義Adapter

Android 自定義Adapter

編輯:關於Android編程

一、VC與模板概念的理解
MVC本來是存在於Desktop程序中的,M是指數據模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式。比如一批統計數據你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。

模型-視圖-控制器(MVC)是Xerox PARC在八十年代為編程語言Smalltalk-80發明的一種軟件設計模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平台的設計模式,並且受到越來越多的使用 ColdFusion 和 PHP 的開發者的歡迎。模型-視圖-控制器模式是一個有用的工具箱,它有很多好處,但也有一些缺點。

 

二、MVC如何工作
MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。

視圖
視圖是用戶看到並與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出不窮,它們包括Macromedia Flash和象XHTML,XML/XSL,WML等一些標識語言和Web services.

如何處理應用程序的界面變得越來越有挑戰性。MVC一個大的好處是它能為你的應用程序處理很多不同的視圖。在視圖中其實沒有真正的處理發生,不管這些數據是聯機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數據並允許用戶操縱的方式。

模型
模型表示企業數據和業務規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用象EJBs和ColdFusion Components這樣的構件對象來處理數據庫。被模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能為多個視圖提供數據。由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。

控制器
控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求。所以當單擊Web頁面中的超鏈接和發送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處理請求,然後用確定用哪個視圖來顯示模型處理返回的數據。

現在我們總結MVC的處理過程,首先控制器接收用戶的請求,並決定應該調用哪個模型來進行處理,然後模型用業務邏輯來處理用戶的請求並返回數據,最後控制器用相應的視圖格式化模型返回的數據,並通過表示層呈現給用戶。

 

自定義Adapter的實現

在xml中添加listview組件,

\

 


    
    
然後創建自己list item模板

 

\

其中包括一個image(頭像),name, age, info(黑色字體信息)。

 



    
    
        
            
            
        
        
    
下面是JAVA代碼部分,開始實現自定義的Adapter。
就像使用Adapter一樣,對V進行初始化,主要是findViewById。
setContentView(R.layout.activity_main);
lv = (ListView) this.findViewById(R.id.lv);
現在已經擁有了V部分,然後是創建M,即模型,使用自定義的數據填充。
ArrayList list = new ArrayList();
自定義的數據可以是數組,map,list,鏈表。只要是可以通過連續標號進行增刪改查的類型就可以。如果使用數組需要自己實現功能。

使用了person類型的list,就需要自定義的person類,這個類中可以實現多屬性的包含。

 

 

package com.example.a18_listview;
public class Person {
    private int image;
    private String name;
    private int age;
    private String info;
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
    public int getImage() {
        return image;
    }
    public Person(int image, String name, int age, String info) {
        super();
        this.image = image;
        this.name = name;
        this.age = age;
        this.info = info;
    }
    public void setImage(int image) {
        this.image = image;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
類中定義了view list模版中需要的屬性。

通過一定的方式填充model數據,這裡簡單的通過for循環和數組進行數據的填充。
private String names[] = { "如花", "旺財", "小翠", "小芳", "小剛", "小龍" };
private int images[] = { R.drawable.ruhua, R.drawable.wangcai,
R.drawable.xiaocui, R.drawable.xiaofang, R.drawable.xiaogang,
R.drawable.xiaolong };
private int ages[] = { 18, 19, 20, 21, 22, 23 };
private String infos[] = {"我很高興"};

        ……
        for (int i = 0; i < 6; i++) {
list.add(new Person(images[i], names[i], ages[i], infos[0]));

}
現在有了M和V ,只差C的實現。
創建自定義的Adapter,MyAdapter類。
參考Adapter系統實現,需要繼承BaseAdapter類,並提示實現4個方法。
首先需要根據自己的需要實現構造函數,構造函數的參數可以根據要求定義。先看需要重寫的方法吧。

第一個:獲得傳入的數據長度,即條目個數,需要返回list長度,或數組長度等。

 

 

@Override
    public int getCount() {// 獲取數量 將來要設定到lsitview控件上面的數據源的個數
        // TODO Auto-generated method stub
        return list.size();
    }
第二個:獲得條目,返回值為object表示可以返回任何類型,可以根據自己需要返回。此處返回的是list ID,也可以返回list條目中的項目,如 : return list.get(position);
@Override
    public Object getItem(int position) {// 獲取元素的對象(一般用在監聽事件)
        // TODO Auto-generated method stub
        return position;
    }
第三個:獲得條目ID,如果在條目中定義了ID 這個屬性,可以返回該值,此處,返回調用值,即list的ID 是順序排列。

 

 

@Override
    public long getItemId(int position) {// 獲取元素的ID(一般用在監聽事件)
        // TODO Auto-generated method stub
        return position;
    }
第四個:填充listView視圖,繪制listView視圖

返回值為view類型,需要返回填充的listView模板的view類型。所以就需要在構造的時候將view傳進來,但是一般layout的id容易獲得,所以傳入的一般是layout id,當然也可以直接傳入view。
標記:構造器需要一個layout id類型參數。並用類屬性保存。private int resource;
下面需要通過layout id得到layout的view類型。
View inflate = LayoutInflater.from(context).inflate(resource, null);
這句話的中需要用到context,上下文依賴關系,即是從哪個java代碼包含的layout文件中查找id值(setContentView(R.layout.activity_main);),這是由於在xml中同名組件公用id,所以需要這個過程來查找id屬於哪個xml。

標記:構造器需要一個context類型的參數。用於保存調用的上下文依賴關系。private Context context;

剩下的就很簡單了,將list中項目的屬性,依次填入listView模板中,注意,此處之需要完成一次的填充,可以使用入口參數position定位list的項目。這個方法是系統繪制時調用,由系統根據list的條目數(getCount() ),進行一次繪制。
根據position取出list中的條目。
標記:構造器需要將list傳入,這個不用說,不傳進來都不知道往模板上填什麼。
Person person = list.get(position);
得到條目中的每個屬性。
String name = person.getName();
int image = person.getImage();
int age = person.getAge();

根據layout中的組件id找到具體的組件,組件歸屬由前面得到的view參數獲得。
// 設定到控件上面去
// 找控件
TextView tv = (TextView) inflate.findViewById(R.id.st_name);
ImageView iv = (ImageView) inflate.findViewById(R.id.st_image);
TextView st_age = (TextView) inflate.findViewById(R.id.st_age);

將list條目的屬性填寫到layout模板的組件中去。
/**
* 設定內容
*/
tv.setText(name);
iv.setImageResource(image);
st_age.setText(age + "");//age為int類型,而settext傳入的參數為charsequence

最後將前面的到的view返回。
return inflate;

方法完整代碼
  /**
     * getview獲取listview的每一項的view視圖(返回的是具體的內容)
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        /**
         * 將布局(int)轉化為view類型視圖
         */
        View inflate = LayoutInflater.from(context).inflate(
            resource, null);
        // 將arraylist數據源的數據設定到控件上面
        Person person = list.get(position);
        String name = person.getName();
        int image = person.getImage();
        int age = person.getAge();
        // 設定到控件上面去
        // 找控件
        TextView tv = (TextView) inflate.findViewById(R.id.st_name);
        ImageView iv = (ImageView) inflate.findViewById(R.id.st_image);
        TextView st_age = (TextView) inflate.findViewById(R.id.st_age);
        /**
         * 設定內容
         */
        tv.setText(name);
        iv.setImageResource(image);
        st_age.setText(age + "");//age為int類型,而settext傳入的參數為charsequence
        return inflate;
    }
最後是完成構造器
根據前面的標記,知道要實現這4個方法,必須要的屬性參數。

 

 

// 參數為 布局,數據源,
    public MyAdapter(int resource, ArrayList list, Context context) {
        this.resource = resource;
        this.list = list;
        this.context = context;
    }
到這裡,自己的myadapter類就完成了。回到主函數中進行MC與VC的關聯,就完成了整個MVC過程。

和系統提供的adapter一樣,對model和adapter關聯,通過adapter的構造器把list數據提交給adapter。
        /**
         * 適配器
         */
        MyAdapter adapter = new MyAdapter(R.layout.mylistview_item, list,
                ThirdAct.this);
將viewlist和adapter關聯,通過listview的set方法將adapter傳遞給listview。
這樣listview就知道通過什麼方式填充listview中的數據,即實現的getView()方法,同時adapter中攜帶了list數據,也就知道需要填寫多少數據。

 

 

        /**
         * 將adapter適配器設定到listview中
         */
        lv.setAdapter(adapter);
到這裡就完成自定義的adapter。

入口函數代碼:
package com.example.a18_listview;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
public class ThirdAct extends Activity {
    private ListView lv;
    private String names[] = { "如花", "旺財", "小翠", "小芳", "小剛", "小龍" };
    private int images[] = { R.drawable.ruhua, R.drawable.wangcai,
            R.drawable.xiaocui, R.drawable.xiaofang, R.drawable.xiaogang,
            R.drawable.xiaolong };
    private int ages[] = { 18, 19, 20, 21, 22, 23 };
    private String infos[] = {"我很高興"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) this.findViewById(R.id.lv);
        /**
         * 數據源
         */
        ArrayList list = new ArrayList();
        for (int i = 0; i < 6; i++) {
            list.add(new Person(images[i], names[i], ages[i], "我很高興"));
        }
        /**
         * 適配器
         */
        MyAdapter adapter = new MyAdapter(R.layout.mylistview_item, list,
                ThirdAct.this);
        /**
         * 將adapter適配器設定到listview中
         */
        lv.setAdapter(adapter);
    }
}
 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved