Adapter

關於各種Adapter
------------------------------------------
1) ArrayAdapter:只能在Item中顯示1種數據
2) SimpleAdapter: 只能顯示固定的1個模板,以至於顯示的每個Item的外觀必須是一模一樣的
3) BaseAdapter:完全自由的定製的Adapter
ListView+Adapter 開發流程
-----------------------------------------
1) 在activity_main.xml中添加ListView控件,至少配置id、layout_width、layout_height屬性,除此以外,ListView沒有必要屬性
2) 在MainActivity.java中,創建數據源List<?>,並在其中添加各項數據(Ps:在使用ArrayAdapter時,數據的集合都應該是List<String>類型的)
3) 在res\layout下,創建新的XML文件,根節點直接選擇TextView
4) 在MainActivity.java中,聲明並創建ArrayAdapter<String>,構造方法中應用R.layout.xxxx(第3步驟的文件)和數據源
5) 初始化ListView控件的對象,調用ListView的setAdapter()方法,爲其配置ArrayAdapter即可



ListView+SimpleAdapter 開發流程
1) 在activity_main.xml中添加ListView控件,至少配置id、layout_width、layout_height屬性,除此以外,ListView沒有必要屬性
2) 在MainActivity.java中,創建數據源List<Map<?,?>>,並在其中添加各項數據(Ps:在使用SimpleAdapter時,數據的集合都應該是List<Map<k,y>>類型的)
3) 在res\layout下,創建新的XML文件,根節點直接選擇TextView
4) 在MainActivity.java中,聲明並創建SimpleAdapter<T>,構造方法中應用R.layout.xxxx(第3步驟的文件)和數據源、from(根據Map的哪個key把數據取出來)、to(把取出來的數據顯示到哪個空間上);
5) 初始化ListView控件的對象,調用ListView的setAdapter()方法,爲其配置SimpleAdapter即可


ListView+BaseAdapter
1) 創建ContactAdapter繼承自BaseAdapter,並添加抽象方法
2) 把getItem()和getItemId()方法置於最後,這2個方法暫時不用具體實現(不寫代碼)
3) 聲明List<Contact>屬性,並添加同類型參數的構造方法,通過構造方法設置該屬性的值
4) 聲明Context屬性,並添加同類型參數的構造方法,通過構造方法設置該屬性的值
5) 聲明LayoutInflater屬性,在構造方法中,通過LayoutInflater.from(Context context)方法設置該屬性的值
6) 重寫getCount()方法,返回值是List<Contact>的長度
7) 重寫getView()方法,先使用LayoutInflater將模板加載爲程序中的對象(View view),然後通過該對象獲取模板中的控件(TextView tvName = (TextView)view.findViewById(R.id.xxxx);),再根據getView()方法的第1個參數int position從List<Contact>中獲取需要顯示的數據,設置到控件中,最後,返回View對象

關於BaseAdapter的優化
------------------------------------------
在使用BaseAdapter時,通過模板加載佈局對象之前,應該對getView()方法的第2個參數View convertView進行判斷,如果爲null,則加載佈局,否則,不加載。
因爲ListView會自動重複使用convertView,當最頂部的Item滑出屏幕時,會將用於顯示它的View對象作爲底部新出現的Item的View對象,用於調用BaseAdapter的getView()方法。
以上優化原則是基於Android自動重複使用View對象實現的。


關於BaseAdapter的優化--使用ViewHolder
------------------------------------------
推薦在ContactAdapter中定義內部類ViewHolder,用於封裝模板中的各個控件,在getView()中,如果convertView爲null,則創建新的ViewHolder,爲ViewHolder中的各個控件賦值,並調用convertView的setTag()方法將ViewHolder對象封裝起來,如果convertView()不爲null,則直接調用convertView的getTag()方法獲取ViewHolder對象。
通過以上代碼,可以減少findViewById()的次數,以提升應用程序的性能。









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