android自定義Adapter

 

在ListView,GridView。。。。中經常用到適配器Adapter,但是anroid 提供的Adapter只是幾種框架,如果我們有需求,還是要自己根據需求而自定義Adapter的

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、

最重要最難理解的也就是第四個方法了,第四個方法主要是返回這個條目的整個信息,它是一個單獨的佈局文件,當然根據android結構也是一個View類的繼承類了,這裏還有一個知識點是LayoutInflater類,它的inflate()方法可以根據佈局文件獲得其View返回值,而最重要的思想是你要從這些條目中獲得其子View(關係爲ListView中有很多條目,每個條目中又有很多組件,我這裏是ListView中多個下載任務是不同的條目,每個下載任務中的名字,進度又是其子View的組件),再得到其子組件之後,就可以根據構造方法中List<Map<String, Object>> list參數傳遞的值進行對應的賦值或者設置資源了,具體代碼如下:

 import java.util.List;
 import java.util.Map;
 
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
 public class MyAdapter extends BaseAdapter
 {
     private Context context;
     
     private LayoutInflater layoutInflater;
     
     private List<Map<String, Object>> list;
     
     //構造方法,參數list傳遞的就是這一組數據的信息
     public MyAdapter(Context context, List<Map<String, Object>> list)
     {
         this.context = context;
         
         layoutInflater = LayoutInflater.from(context);
         
         this.list = list;
     }
     
     //得到總的數量
     public int getCount() 
     {
         // TODO Auto-generated method stub
         return this.list!=null? this.list.size(): 0 ;
     }
 
     //根據ListView位置返回View
     public Object getItem(int position)
     {
         // TODO Auto-generated method stub
         return this.list.get(position);
     }
 
     //根據ListView位置得到List中的ID
     public long getItemId(int position) 
     {
         // TODO Auto-generated method stub
         return position;
     }
 
     //根據位置得到View對象
     public View getView(int position, View convertView, ViewGroup parent) 
     {    
         if(convertView == null)
         {    
             convertView = layoutInflater.inflate(R.layout.item, null);
         }
         
         //得到條目中的子組件
         TextView tv1 = (TextView)convertView.findViewById(R.id.nameTextView);
         ProgressBar pb = (ProgressBar)convertView.findViewById(R.id.sizeProgressBar);
         TextView tv2 = (TextView)convertView.findViewById(R.id.sizeTextView);
         
         //從list對象中爲子組件賦值
         tv1.setText(list.get(position).get("name").toString());
         pb.setProgress(Integer.parseInt(list.get(position).get("size").toString()));
         tv2.setText(list.get(position).get("size").toString());
         
         return convertView;
     }
 }


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章