android學習摘記——自定義Adapter的心得

在ListView,GridView。。。。中常常用到適配器Adapter,可是anroid 提供的Adapter只是幾種框架,若是咱們有需求,仍是要本身根據需求而自定義Adapter的java

android提供的三種Adapter主要有ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,ArraAdapter是簡單的字符串適配器(很醜,由於沒辦法帥。。。),SimpleAdapter是能夠自定義子View佈局的,能夠有圖片(只限於本地圖片,若是要用網絡加載圖片,請參考我以前的一篇Blog),SimpleCursorAdapter主要用於數據庫,前兩個的數據來源通常都是String[]或者List,後一個的數據來源通常是數據庫查詢獲得的Cursorandroid

而咱們自定義用的最多的仍是繼承自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的條目就能夠了this

第二個方法是要返回一個子View,即ListView中的一個子條目,固然你也能夠自定義返回你想要的信息對象

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

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

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 }

相關文章
相關標籤/搜索