天天看點

Android 中Adapter歸納

一,擴充卡.          顧名思義,就是把一些資料給弄得适當,适合以便于在View上顯示。可以看作是

界面資料綁定的一種了解。它所操縱的資料一般都是一些比較複雜的資料,如數組,連結清單,資料庫,集合等。擴充卡就像顯示器,把複雜的東西按人可以接受的方式來展現。那麼擴充卡是怎麼處理得到的資料,并把它顯示出來的呢。其實很簡單,說白了擴充卡它也是一個類,在類裡面它實作了父類的這幾個方法:

publicint getCount() //得到資料的行數

public Object getItem(int position)//根據position得到某一行的記錄

public long getItemId(int position)//得到某一條記錄的ID

//下面這個方法是最重要的相比于其它幾個方法,它顯式的定義了,擴充卡将要以什麼樣的方式去顯示我們所填充的資料,在自定義的擴充卡裡面我們通常會給它寫個布局檔案

publicView getView(int position, View convertView, ViewGroup parent)  

我們常用的擴充卡一共有三個,當然不包含自定義的擴充卡,哪三個 那就是ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 這三個,他們都是繼承BaseAdapter

其中以ArrayAdapter最為簡單,隻能展示一行字。SimpleAdapter有最好的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對資料庫的簡單結合,可以方面的把資料庫的内容以清單的形式展示出來。

android提供的三種Adapter主要有ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,ArraAdapter是簡單的字元串擴充卡,SimpleAdapter是可以自定義子View布局的,可以有圖檔(隻限于本地圖檔,如果要用網絡加載圖檔,請參考我之前的一篇Blog),SimpleCursorAdapter主要用于資料庫,前兩個的資料來源一般都是String[]或者List,後一個的資料來源一般是資料庫查詢得到的Cursor

而我們自定義用的最多的還是繼承自SimpleAdapter,下面說一下具體用法

我還是連着上一篇Blog,想做一個顯示帶下載下傳進度條的子View顯示于ListView中,SimpleAdapter可以顯示一般的圖檔,但是無法顯示進度條(因為不隻是要顯示,還要有實時更新),是以我們的做法是繼承SimpleAdapter,具體要複寫的方法有4個:

public int getCount() 

public Object getItem(int position)

public long getItemId(int position)

public View getView(int position, View convertView, ViewGroup parent) 

還有一個更重要的是其構造方法MyAdapter(Context context, List<Map<String, Object>> list),參數不是固定的,可以根據要用到的資料自己定義,第一個參數是要顯示的上下文環境,第二個參數是用來記錄各個條目的資訊

第一個方法主要是傳回ListView中要顯示的子View數量,也就是下載下傳任務數,隻要傳回構造方法中的list的條目就可以了

第二個方法是要傳回一個子View,即ListView中的一個子條目,當然你也可以自定義傳回你想要的資訊

第三個方法是根據ListView中的位置傳回id、

二,一般對于前兩個擴充卡,他們的資料來源無非就是String[]或者List 。下面我們列舉兩個例一子: 例一,數組作為資料源,填充的是ArrayAdapter     public class Example extends ListActivity{

      String[] sex = new String(){"男",“女”}//資料源

      ArrayAdapter<String>  adapter;//數組擴充卡,用的是泛型

      public voidonCreate(Bundle SavedInstanceState){

                super.onCreate(SavedInstanceStat); 

                //在對擴充卡初始化的時候,順便把資料源裝載到擴充卡裡,                                         //this.android.R.Layout.Simple_List_Item_1這句話

                   //的意思是将資料源以系統定義好的樣式放到擴充卡裡.             

                adapter=newArrayAdapter<String(this.android.R.Layout.Simple_List_Item_1,sex);

                   this.setAdapter(adapter);//這是一個控件類,是以可以直接将擴充卡綁定到本身對象中。

                        }

                }

            例二:List作為資料源,填充的是SimpleAdapter

                        ListView list = (ListView)findViewById(R.id.MyListView);        

                       //生成動态數組,并且轉載資料

                      ArrayList<HashMap<String, String>> mylist = newArrayList<HashMap<String, String>>();

                      for(int i=0;i<30;i++)

                              {

                                       HashMap<String, String>map = new HashMap<String, String>();

                                       map.put("ItemTitle","This is Title.....");

                                       map.put("ItemText","This is text.....");

                             mylist.add(map);

                             }

                    //生成擴充卡,數組===》ListItem

                      SimpleAdapter mSchedule = new SimpleAdapter(this, //沒什麼解釋 mylist,//資料來源      R.layout.my_listitem,//ListItem的XML實作 //動态數組與ListItem對應的子項           

                      new   String[]{"ItemTitle", "ItemText"}, //ListItem的XML檔案裡面的兩個TextView ID  new int[] {R.id.ItemTitle,R.id.ItemText});

                     //添加并且顯示

                      list.setAdapter(mSchedule);

                    }

三,應該說着兩個例子都不難,都是一些我們經常見到的用法,那麼對于SimpleCursorAdapter又是怎麼用的呢,SimpleCursorAdapter一般主要用于資料庫,它的資料來源一般都是資料庫查詢得到的Cursor 我們來看下面的例子:

                    String uriString = “content://contacts/people/”;

                     Cursor myCursor =managedQuery(Uri.parse(uriString), null, null, null, null);

          String[] fromColumns = new String[]{People.NUMBER, People.NAME};

                    int[] toLayoutIDs = new int[] {R.id.nameTextView, R.id.numberTextView};

                   SimpleCursorAdapter myAdapter;

                   myAdapter=newSimpleCursorAdapter(this,R.layout.simplecursorlayout,myCursor,fromColumns,

                   toLayoutIDs);//傳入目前的上下文、一個layout資源,一個遊标和兩個數組:一個包含使用的列    

                   //的名字,另一個(相同大小)數組包含View中的資源ID,用于顯示相應列的數 

                   據值。

                   myListView.setAdapter(myAdapter);

我們把一個遊标綁定到了ListView上,并使用自定義的layout顯示來顯示每一個Item。

四,下面我們來定義自己的擴充卡。

             為什麼要定義自己的擴充卡呢,原因就在于,當我們想用一些其它的展現方式,或者是我們需要的,呈現方式,這是就得DIY了。

首先我們定義一個類讓它繼承自BaseAdapter,再讓它實作一裡面所說的那幾個方法。那麼這個自定義擴充卡就算好了。裡面的一些方法我在上面都介紹過了,在這就不在贅述了。

Android 中Adapter歸納
1 
   import
    java.util.List;

    2 
   
   import
    java.util.Map;

    3 
   

    4 
   
   import
    android.content.Context;

    5 
   
   import
    android.view.LayoutInflater;

    6 
   
   import
    android.view.View;

    7 
   
   import
    android.view.ViewGroup;

    8 
   
   import
    android.widget.BaseAdapter;

    9 
   
   import
    android.widget.LinearLayout;

   10 
   
   import
    android.widget.ProgressBar;

   11 
   
   import
    android.widget.TextView;

   12 
   

   13 
   
   public
    
   class
    MyAdapter 
   extends
    BaseAdapter

   14 
   {

   15 
       
   private
    Context context;

   16 
       

   17 
       
   private
    LayoutInflater layoutInflater;

   18 
       

   19 
       
   private
    List
   <
   Map
   <
   String, Object
   >>
    list;

   20 
       

   21 
       
   //
   構造方法,參數list傳遞的就是這一組資料的資訊
   

   22 
   
       
   public
    MyAdapter(Context context, List
   <
   Map
   <
   String, Object
   >>
    list)

   23 
       {

   24 
           
   this
   .context 
   =
    context;

   25 
           

   26 
           layoutInflater 
   =
    LayoutInflater.from(context);

   27 
           

   28 
           
   this
   .list 
   =
    list;

   29 
       }

   30 
       

   31 
       
   //
   得到總的數量
   

   32 
   
       
   public
    
   int
    getCount() 

   33 
       {

   34 
           
   //
    TODO Auto-generated method stub
   

   35 
   
           
   return
    
   this
   .list
   !=
   null
   ?
    
   this
   .list.size(): 
   0
    ;

   36 
       }

   37 
   

   38 
       
   //
   根據ListView位置傳回View
   

   39 
   
       
   public
    Object getItem(
   int
    position)

   40 
       {

   41 
           
   //
    TODO Auto-generated method stub
   

   42 
   
           
   return
    
   this
   .list.get(position);

   43 
       }

   44 
   

   45 
       
   //
   根據ListView位置得到List中的ID
   

   46 
   
       
   public
    
   long
    getItemId(
   int
    position) 

   47 
       {

   48 
           
   //
    TODO Auto-generated method stub
   

   49 
   
           
   return
    position;

   50 
       }

   51 
   

   52 
       
   //
   根據位置得到View對象
   

   53 
   
       
   public
    View getView(
   int
    position, View convertView, ViewGroup parent) 

   54 
       {    

   55 
           
   if
   (convertView 
   ==
    
   null
   )

   56 
           {    

   57 
               convertView 
   =
    layoutInflater.inflate(R.layout.item, 
   null
   );

   58 
           }

   59 
           

   60 
           
   //
   得到條目中的子元件
   

   61 
   
           TextView tv1 
   =
    (TextView)convertView.findViewById(R.id.nameTextView);

   62 
           ProgressBar pb 
   =
    (ProgressBar)convertView.findViewById(R.id.sizeProgressBar);

   63 
           TextView tv2 
   =
    (TextView)convertView.findViewById(R.id.sizeTextView);

   64 
           

   65 
           
   //
   從list對象中為子元件指派
   

   66 
   
           tv1.setText(list.get(position).get(
   "
   name
   "
   ).toString());

   67 
           pb.setProgress(Integer.parseInt(list.get(position).get(
   "
   size
   "
   ).toString()));

   68 
           tv2.setText(list.get(position).get(
   "
   size
   "
   ).toString());

   69 
           

   70 
           
   return
    convertView;

   71 
       }

   72 
   }