Android應用項目中BaseAdapter、SimpleAdapter和ArrayAdapter中的三種適配器

来源:http://www.cnblogs.com/demoMeng/archive/2016/11/30/6115289.html
-Advertisement-
Play Games

一、寫在前面: 本次我們來講解一下Android應用中三個適配器:BaseAdapter、SimpleAdapter和ArrayAdapter。其中常見的是BaseAdapter,也是個人推薦使用的適配器。 二、深入瞭解: 1.什麼是適配器? 適配器:在安卓中,顧名思義就是把數據變成符合界面風格的形 ...


一、寫在前面

  本次我們來講解一下Android應用中三個適配器:BaseAdapter、SimpleAdapter和ArrayAdapter。其中常見的是BaseAdapter,也是個人推薦使用的適配器。

二、深入瞭解:

  1.什麼是適配器?

   適配器:在安卓中,顧名思義就是把數據變成符合界面風格的形式,並且通過ListView顯示出來。也就是說適配器是數據和界面之間的橋梁

   適配器在資料庫中的數據(後臺)和顯示頁面(前端)中充當一個轉換器的角色,資料庫中的數據(如數組,鏈表,資料庫,集合等)通過適配器變成類手機頁面能夠正常顯示的數據。可以看作是界面數據綁定的一種理解。假設把數據、適配器和ListView(頁面)比喻成一個MVC模式的話,那麼適配器(Adapter)在這中間就充當了Controller的角色。

  

  2.為什麼對象設置數據源   

   一般是為ListView提供數據的轉換,當然GridView[網格視圖]、Spinner[下拉列表]、Gallery[畫廊]、ViewPage等都需要使用適配器來為其設置數據源。

 

三、代碼示例:

   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;
        }
    
    }
    
}

 

      

      更進一步:

    

 

     4、運行結果:  

        

 


 

  

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • UITableview是大家常用的UIKit組件之一,使用中我們最常遇到的就是對delegate和dataSource這兩個委托的使用。我們大多數人可能知道當reloadData這個方法被調用時,delegate和dataSource就會被回調,但是其中具體的細節,可能很多人不會去探究。我最近有興趣 ...
  • 學習到現在的主要問題是沒有進行例子的完美歷練,說白了,就是沒動手親自的試試,寫寫對應的代碼,理解一下主要的設計思想,這個應該是學習設計模式我最重要的地方,那麼現在針對之前學習的設計模式做一個總結和回顧吧 0.設計模式分析規律 在講解這個設計模式之前,我們應該學習到設計的原則,1.分析程式中變化的位置 ...
  • 看到一些程式都有這種寫法,也不知道原創者是誰了。先在博客保存下。 在.m文件 在.h文件 ...
  • 記錄下一些不常用的技巧,以防忘記,複製用。 1、獲取當前的View在Window的frame: 2、UIImageView 和UILabel 等一些控制項,需要加這句才能setCorn 3、手機上的沙盒路徑要加"Documents",不然存儲寫入失敗!mac上不用! 4、圖片拉伸不失真,如聊天軟體對話 ...
  • 1、登錄developer.apple.com,查看到期時間 2、到期提醒通知,點擊Renew Membership續費(一般提前一個月提醒續費) 3、個人開發者賬號續費需要支付 688人民幣/年(99刀),企業賬號則需要299刀 4、Review your purchase details核查訂單 ...
  • init.rc腳本是由Android中linux的第一個用戶級進程init進行解析的。 init.rc 文件並不是普通的配置文件,而是由一種被稱為“Android初始化語言”(Android Init Language,這裡簡稱為AIL)的腳本寫成的文件。 該文件在ROM中是只讀的,即使有了root ...
  • 在IOS5之後,蘋果為避免根據UDID獲得用戶的信息,而禁止使用uniqueIdentifier獲得UDID,但是仍有些應用需要根據UDID區分設備 有一個系統的庫IOKit.framework可以獲得設備的唯一標識 但是這個方法只能獲得模擬器上的UDID很坑爹啊 那還有另外的方法獲得設備的信息,那 ...
  • 原文標題:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 時間:Nov 28, 2016 原文鏈接:http://antonioleiva.com/variables-kotlin/ K ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...