1. 程式人生 > >三種adapter的區別和用法

三種adapter的區別和用法

Android提供的三種adapter主要有ArrayAdapter,SimpleAdapter,SimoleCuisorAdapter是簡單的字串介面卡,simpleAdapter是可以自定義子View佈局的,可以有圖片,SimpleCursor主要用語資料庫,前兩個的資料來源一般都是String[]或者List,後一個數據來源一般是資料庫查詢得到的Cuesor 而我們自定義用的最多的還是繼承自SimpleAdapter。

介紹一下三種主要的adapter:

1.CursorAdapter繼承於BaseAdapter,它是個虛類,它為cursor和ListView提供了連線的橋樑。它的資料是與Cursor繫結的。它提供兩個抽象函式newView和bindView給派生類特製化:newView生成自定 義的View,bindView為自定義View繫結資料。所以我們繼承CursorAdapter時,只需要實現這兩個函式即可。

2.ResourceCursorAdapter 繼承於CursorAdapter,它包含LayoutInflater物件,可以把xml轉化成view。成員函式newView和 newDropDownView,根據建構函式初始化時傳入或是setViewResource設定的資源id,產生對應的view並返回。

3.SimpleCursorAdapter繼承於CursorAdapter,通過遊標訪問資料庫。

一、arrayAdapter的程式碼實現

要求:使用陣列介面卡輸出相對應的資料到ListView中

1、首先、建立Android工程,後在佈局檔案中定義一個ListView,並且設定好相關屬性:

複製程式碼
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height
="wrap_content"/> </RelativeLayout>
複製程式碼

2、其次、在activity類中書寫程式碼,具體請看程式碼,並且程式碼上有相關的註釋

複製程式碼
package com.mqz.android_arrayadapter;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class MainActivity extends Activity {
    
      private ListView listView;    //定義ListView用來獲取到,佈局檔案中的ListView控制元件
        private String[] city = {"廣州","深圳","北京","上海","香港","澳門","天津"} ;  //定義一個數組,作為資料來源
        private ArrayAdapter<String> arrayAdapter;    //定義一個數組介面卡物件

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            listView = (ListView)findViewById(R.id.listView); //獲取佈局檔案中的ListView控制元件物件

/* * Context context, 上下文物件 * int resource, items項顯示的佈局樣式,一般是系統的佈局文 android.R.layout.** (但是需要選擇和ListView相適合的佈局檔案否則執行報錯) * String[] objects 陣列物件(資料來源) * * */ //建立陣列介面卡物件,並且通過引數設定類item項的佈局樣式和資料來源 arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, city); //把陣列介面卡載入到ListView控制元件中 listView.setAdapter(arrayAdapter); } }
複製程式碼

3、執行結果:這樣不需要我們自己定義TextView控制元件中的內容,通過陣列介面卡實現了這一個目的。

        

二、 SimpleAdapter的程式碼實現

要求:把後臺資料填充到頁面,其中包括需要填充的有TextView和ImageView,也就是名字和圖片顯示到頁面上。

1、首先,建立好android工程,並且在主佈局檔案中新增一個ListView控制元件

複製程式碼
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context="com.mqz.android_simpleadapter.MainActivity" >
        
    <ListView 
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></ListView>

</LinearLayout>
複製程式碼

2、其次,在Activity類中書寫程式碼,其間附有註釋,具體如下:

複製程式碼
package com.mqz.android_simpleadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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


public class MainActivity extends Activity {

    private ListView listView;   //定義ListView物件,用來獲取佈局檔案中的ListView控制元件
    private String[] name = {"小明","小華","小樑","小王","小林","小趙"};  //定義一個名字陣列,用來為資料來源提供姓名
    private int[] images = {R.drawable.one,R.drawable.two,R.drawable.three,R.drawable.four,R.drawable.five,R.drawable.six};//定義一個 整形陣列,用來為資料來源中的頭像 
    private List<Map<String,Object>> list_map = new ArrayList<Map<String,Object>>(); //定義一個介面卡物件
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        listView = (ListView) findViewById(R.id.listView); //獲取佈局檔案中的ListView物件
        
        //1.準備好資料來源,迴圈為listView新增資料(資料來源的準備工作,這裡是模擬從SQLite中查詢資料)
        for(int i=0;i<6;i++){
            Map<String,Object> items = new HashMap<String, Object>(); //建立一個鍵值對的Map集合,用來存放名字和頭像
            items.put("pic", images[i]);  //放入頭像, 根據下標獲取陣列
            items.put("name", name[i]);      //放入名字, 根據下標獲取陣列         
            list_map.add(items);   //把這個存放好資料的Map集合放入到list中,這就完成類資料來源的準備工作   
        }   
        
        //2、建立介面卡(可以使用外部類的方式、內部類方式等均可)
        SimpleAdapter simpleAdapter = new SimpleAdapter( 
                                        MainActivity.this,/*傳入一個上下文作為引數*/
                                        list_map,         /*傳入相對應的資料來源,這個資料來源不僅僅是資料而且還是和介面相耦合的混合體。*/
                                        R.layout.list_items, /*設定具體某個items的佈局,需要是新的佈局,而不是ListView控制元件的佈局*/
                                        new String[]{"pic","name"}, /*傳入上面定義的鍵值對的鍵名稱,會自動根據傳入的鍵找到對應的值*/ 
                                        new int[]{R.id.items_imageView1,R.id.items_textView1});/*傳入items佈局檔案中需要指定傳入的控制元件,這裡直接上id即可*/
        
        //3、為listView加入介面卡
        listView.setAdapter(simpleAdapter);
            
        });
        
    }
   
}
複製程式碼

詳細的解釋適配中的引數關係:

  

3、建立 item 項的 layout 佈局檔案:

             

下面是 item 項的佈局檔案:

複製程式碼
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/items_imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <TextView
        android:id="@+id/items_textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="52dp"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/items_textView2"
        android:text="hello android!"
        android:layout_alignParentRight="true"
        />
    
    
</RelativeLayout>
複製程式碼

4、執行結果:  

        

三、 BaseAdapter程式碼實現

1、建立好安卓工程之後,新建一個包,並且子這個包中定義一個 User 實體類(用來後面的資料來源使用),可以簡單定義一兩個屬性即可,這裡只是做測試而已。(模擬從資料庫中查詢資料。)

        

2、在 MainActivity 類中進行主要的程式碼書寫:

複製程式碼
package com.mqz.android_baseadapter_one;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.mqz.android_baseAdapter_one_entity.User;


public class MainActivity extends Activity {
    
    private ListView listView;  //定義ListView控制元件,用來獲取佈局檔案中的ListView
    private List<User> list;  //存放資料來源你的集合,泛型設定為User型別。
    private int[] images = {R.drawable.one,R.drawable.two,R.drawable.three,R.drawable.four,R.drawable.five,};//定義陣列,儲存圖片Id用用來設定頭像 
    private String[] names = {"張三","李四","王五","趙六","天啟"};//定義字串陣列,用來儲存使用者的名字
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listView);//獲取ListView控制元件
        
        //1.載入資料來源,在這裡只是模擬一個從資料庫中查詢資料的操作。(模擬資料庫查詢資料的操作)
        list = new ArrayList<User>();
        for(int i=0;i<5;i++){
            User u = new User();
            u.setName(names[i]); //設定名字,根據定義的陣列設定
            u.setPic(images[i]); //定義頭像,在實體類中需要定義為整形,因為在R檔案中所有的資原始檔都是整形的。
            list.add(u);         //新增物件到list集合中,資料來源準備成功。
        }
        //2.建立BaseAdapter介面卡,並且配置好相對應的佈局檔案(本次使用內部類的方式)
        
        //3.把介面卡載入到ListView中
        MyBaseAdapter adapter = new MyBaseAdapter();  //建立這個成員內部類的物件
        listView.setAdapter(adapter);                 //為資料來源設定好介面卡    
            
    }
    
    class MyBaseAdapter extends BaseAdapter{

        
        //獲取當前items項的大小,也可以看成是資料來源的大小
        @Override
        public int getCount() {
            return list.size();
        }
        //根據item的下標獲取到View物件
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }
        //獲取到items的id
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
        
        
        //根據傳入item的下標,獲取到view物件
        /*
         * int position,      表示item所在listView中的下標,也是在資料來源中下標所對應的資料 
         * View convertView,  快取機制,當一些item項滑出螢幕的時候,會建立新的View物件,這樣會使得記憶體資源佔據,
         *                                  所以使用convertView判斷是否為空,如果為空的說明item沒有滑出,需要建立新的view物件
         *                          如果不為空,說明已經滑出類螢幕所以使用convertView ,view = convertView,
         *                                  可以把convert 理解為滑出的view物件         
         * ViewGroup parent   檢視組物件,即 表示當前繪製的items項所屬的ListView物件。
         * */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view = null;
            
            //獲取填充器物件,這個物件可以幫助我們繪製出items項,獲取方式有多種:
            //LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
            LayoutInflater inflater = MainActivity.this.getLayoutInflater();
            /*
            呼叫打氣筒中的 inflate(int resource, ViewGroup root) 方法
            第一個引數是一個佈局檔案物件,通過這個佈局檔案,inflater會在這佈局檔案中繪製items項
            第二個引數是需不需要將第一個引數中的那個佈局檔案嵌入到另外一個佈局檔案中。如果要寫上佈局檔案的id,如果不需要直接寫null
            */
            view = inflater.inflate(R.layout.items_layout, null); 
            User u = list.get(position);//通過回撥這個方法傳過來的position引數獲取到指定資料來源中的物件
            //找到佈局檔案中的控制元件
            ImageView pic = (ImageView) view.findViewById(R.id.items_pic);
            TextView name = (TextView) view.findViewById(R.id.itmes_name);
            pic.setImageResource(u.getPic());//從資料來源中獲取頭像 設定到佈局檔案的ImageView控制元件中。
            name.setText(u.getName());//從資料來源中獲取名字 設定到佈局檔案的TextView控制元件中。
            
            
            return view;
        }
    
    }
    
}
複製程式碼

更進一步:

    

相關推薦

hive 方式區別搭建

一、安裝模式介紹:     Hive官網上介紹了Hive的3種安裝方式,分別對應不同的應用場景。     1、內嵌模式(元資料保村在內嵌的derby種,允許一個會話連結,嘗試多個會話連結時會報錯)     2、本地模式(本地安裝mysql 替代derby儲存元資料)   

adapter區別用法

Android提供的三種adapter主要有ArrayAdapter,SimpleAdapter,SimoleCuisorAdapter是簡單的字串介面卡,simpleAdapter是可以自定義子View佈局的,可以有圖片,SimpleCursor主要用語資料庫,前兩個的

.NET FrameworkTimer的區別用法說明

.NET Framework三種Timer的區別和用法說明 1.實現按使用者定義的時間間隔引發事件的計時器。此計時器最宜用於 Windows 窗體應用程式中,並且必須在視窗中使用。 System.Windows.Forms.Timer 2.提供以指定的時間間隔執行方法的機制。無法繼承

.NET WinForm中的Timer(計時器)的區別用法

.NET中的三種Timer(計時器)的區別和用法卡卡 發表於 2014/12/5 13:02:00 | 分類標籤: Timer 計時器 ASP.NET NET中有3個不同的定時器。這3個定時器分別是: 1.實現按使用者定義的時間間隔引發事件的計時器。此計時器最宜用於 Wi

hreadPoolExecutor使用思考(上)-線程池大小設置與BlockingQueue的實現區別

滿足 interface 我會 很多 程序員 dong turn 插入 p s 閱讀更多 工作中多處接觸到了ThreadPoolExecutor。趁著現在還算空,學習總結一下。 前記: jdk官方文檔(javadoc)是學

js對url進行編碼解碼(方式區別

*** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不經過編碼直接用於 URL。 ***例如:搜尋的中文關鍵字,複製網址之後再貼上就會發現該URL已經被轉碼。 1、escape 和 unescape 原理:對除ASCII字母、數字、標點符號 @  *  _  +

理解Android多執行緒裡面任務RunnableCallableFutureTask的用法

理解三種任務Runnable和Callable和FutureTask的用法 1.Runnable 和Callable和FutureTask的區別 相同點:都屬於執行緒池中要被執行的任務; 不同點: Runnable是無返回值的任務,可以線上程中使用 Callable是有返回

js的call() ,apply() 兩方法的區別用法,最白話文的解釋,讓枯燥滾粗!

背景:今天群裡有 妹子(我就不指名道姓嘍)說:百度了一圈calll()函式和apply()函式,感覺還是糊里糊塗然後群裡熱鬧了,各種表情包,各種殷勤,你懂的!正好我前幾天剛又重新翻了一遍 那本 600多

ThreadPoolExecutor使用思考(上)-執行緒池大小設定與BlockingQueue的實現區別

工作中多處接觸到了ThreadPoolExecutor。趁著現在還算空,學習總結一下。 前記: jdk官方文件(javadoc)是學習的最好,最權威的參考。文章分上中下。上篇中主要介紹ThreadPoolExecutor接受任務相關的兩方面入參的意義和區別,池大小引

iOS 計時器定時器的用法NSTimer、CADisplayLink、GCD

並且 reat clas 就會 固定 tro run mod 不同 原文:http://www.cocoachina.com/ios/20160919/17595.html 一、三種計時器 二、全局倒計時 #import "ViewController.h" @inte

GET,POST,PUT,DELETE的區別 用法

網關 到你 服務端 utf-8 option 數學 返回 由於 ces Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網絡上的資源,而HTTP中

nth-child,nth-last-child,only-child,nth-of-type,nth-last-of-type,only-of-type,first-of-type,last-of-type,first-child,last-child偽類區別用法

type nth 只有一個 not 同時 選擇器 -type span 進行 我將這坨偽類分成三組,第一組:nth-child,nth-last-child,only-child第二組:nth-of-type,nth-last-of-type,第三組:first-of-tp

隱藏覆蓋的區別用法

靜態方法 類的變量 靜態 如何 區別 參數類型 子類重寫 pre 父類 講隱藏和覆蓋之前先看兩個概念:靜態類型和動態類型。 任何一個引用變量都有兩個類型:一個叫靜態類型,也就是定義該引用變量的類型;另一個叫動態類型,也就是該引用實際指向的對象類型。 比如對於兩個類A和類B,

Python中內置數據類型list,tuple,dict,set的區別用法

必須 div bsp 10個 用法 保險 進行 mov python Python語言簡潔明了,可以用較少的代碼實現同樣的功能。這其中Python的四個內置數據類型功不可沒,他們即是list, tuple, dict, set。這裏對他們進行一個簡明的總結。

繼承方式訪問權限

-a prot play 9.png png -h .cn orm font 也就是說子類只能訪問父類的保護和公有成員,而對象只能訪問公有成員。繼承方式 1. 三種繼承方式不影響子類對父類的訪問權限,子類對父類只看父類的訪問控制權。 2. 繼承

HTML中paddingmargin的區別用法

布局 語法 tom mil strong 替換元素 它的 一段 div   margin(外邊距) 定義:margin是用來隔開元素與元素的間距,發生在元素本身的外部,margin用於布局分開元素使元素與元素互不相幹。 提示:margin: top right bottom

Synchronizedlock的區別用法

等等 name log 括號 下使用 沒有 pos nal 輕量級 一、synchronized和lock的用法區別 (1)synchronized(隱式鎖):在需要同步的對象中加入此控制,synchronized可以加在方法上,也可以加在特定代碼塊中,括號中表示需要鎖的

cookiesession的區別用法

exp 連接 介紹 相關 mil spl 需要 display 關註 flask中cookie和session介紹 一、cookie: 在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接後並且登錄成功後,第二次請求服務器依然不能知道當前請求是哪個用戶。cook

out ref params 的區別用法

ber 完成後 使用 params st2 可變 但是 sco code 1. out 參數。 如果你在一個方法中,返回多個相同類型的值,可以考慮返回一個數組。 但是,如果返回多個不同類型的值,返回數組就不可取。這個時候可以考慮使用out參數。 out參數就側重於在一個方法

SQL中INNER、LEFT、RIGHT JOIN的區別用法詳解

相信很多人在剛開始使用資料庫的INNER JOIN、LEFT JOIN和RIGHT JOIN時,都不太能明確區分和正確使用這三種JOIN操作,本文通過一個簡單的例子通俗易懂的講解這三者的區別,希望對大家能帶來幫助。 首先,我們建立示例資料庫和表。同時也要明確一個概念:A INN