經常使用適配器

適配器包括ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。以及自定義適配器。android

ArrayAdapter

數據來源:String[]和List數據庫

用法:1
  1. publicclassArrayAdapterActivityextendsListActivity{
  2. privateListView listView;
  3. @Override
  4. publicvoid onCreate(Bundle savedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. String[] strs ={"1","2","3","4","5"};
  7. ArrayAdapter<String> adapter =
  8. newArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
  9. setListAdapter(adapter);
  10. }
  11. }
  12. }
用法:2
  1. publicclassMyListViewextendsActivity{
  2. privateListView listView;
  3. @Override
  4. publicvoid onCreate(Bundle savedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. ArrayAdapter<String> adapter =
  7. newArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData());
  8. listView =newListView(this);
  9. listView.setAdapter();
  10. setContentView(listView);
  11. }
  12. privateList<String> getData(){
  13. List<String> data =newArrayList<String>();
  14. data.add("測試數據1");
  15. data.add("測試數據2");
  16. data.add("測試數據3");
  17. data.add("測試數據4");
  18. return data;
  19. }
  20. }

上面代碼使用了Adapter(Context context, int resourcefulness, List objects)來裝配數據,要裝配這些數據就須要一個鏈接List View視圖對象和數組數據的適配器來二者的適配工做,Adapter的構造須要三個參數,依次爲this,佈局文件(注意這裏的佈局文件描述的是列表的每一行的佈局,android.R.layout.simple_list_item_1是系統定義好的佈局文件只顯示一行文字,數據源(一個List集合)。同時用adapter()完成適配的最後工做。數組

SimpleAdapter

SimpleAdapter的擴展性最好,能夠定義各類各樣的佈局出來,能夠放上ImageView(圖片),還能夠放上Button(按鈕),CheckBox(複選框)等等。下面的代碼都直接繼承了ListActivity,ListActivity和普通的Activity沒有太大的差異,不一樣就是對顯示ListView作了許多優化,方面顯示而已。ide

案例
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <ImageView
  7. android:id="@+id/img"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_margin="5dp"/>
  11. <TextView
  12. android:id="@+id/title"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:textColor="#ffffff"
  16. android:textSize="20sp"/>
  17. </LinearLayout>
  1. publicclassSimpleAdapterActivityextendsListActivity{
  2. @Override
  3. publicvoid onCreate(Bundle savedInstanceState){
  4. super.onCreate(savedInstanceState);
  5. SimpleAdapter adapter =
  6. newSimpleAdapter(this, getData(), R.layout.simple,
  7. newString[]{"title","img"},
  8. newint[]{ R.id.title, R.id.img }
  9. );
  10. setListAdapter(adapter);
  11. }
  12. privateList<Map<String,Object>> getData(){
  13. //map.put(參數名字,參數值)
  14. List<Map<String,Object>> list =newArrayList<Map<String,Object>>();
  15. Map<String,Object> map =null;
  16. map =newHashMap<String,Object>();
  17. map.put("title","摩托羅拉");
  18. map.put("img", R.drawable.icon);
  19. list.add(map);
  20. map =newHashMap<String,Object>();
  21. map.put("title","諾基亞");
  22. map.put("img", R.drawable.icon);
  23. list.add(map);
  24. map =newHashMap<String,Object>();
  25. map.put("title","三星");
  26. map.put("img", R.drawable.icon);
  27. list.add(map);
  28. return list;
  29. }
  30. }

SimpleCursorAdapter

案例
  1. publicclassSimpleCursorAdapterActivityextendsListActivity{
  2. @Override
  3. publicvoid onCreate(Bundle savedInstanceState){
  4. super.onCreate(savedInstanceState);
  5. //得到一個指向系統通信錄數據庫的Cursor對象得到數據來源
  6. Cursor cur = getContentResolver().query(People.CONTENT_URI,null,null,null,null);
  7. startManagingCursor(cur);
  8. //實例化列表適配器
  9. ListAdapter adapter =newSimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur,
  10. newString[]{People.NAME},
  11. newint[]{android.R.id.text1});
  12. setListAdapter(adapter);
  13. }
  14. }

自定義Adapter

有時候,列表不光會用來作顯示用,咱們一樣能夠在在上面添加按鈕。添加按鈕首先要寫一個有按鈕的xml文件,而後天然會想到用上面的方法定義一個適配器,而後將數據映射到佈局文件上。可是事實並不是這樣,由於按鈕是沒法映射的,即便你成功的用佈局文件顯示出了按鈕也沒法添加按鈕的響應,這時就要研究一下ListView是如何現實的了,並且必需要重寫一個類繼承BaseAdapter。下面的示例將顯示一個按鈕和一個圖片,兩行字若是單擊按鈕將刪除此按鈕的所在行。並告訴你ListView到底是如何工做的。函數

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <ImageView
  7. android:id="@+id/img"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_margin="5px"/>
  11. <LinearLayout
  12. android:orientation="vertical"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content">
  15. <TextView
  16. android:id="@+id/title"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:textColor="#FFFFFFFF"
  20. android:textSize="22px"/>
  21. <TextView
  22. android:id="@+id/info"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:textColor="#FFFFFFFF"
  26. android:textSize="13px"/>
  27. </LinearLayout>
  28. <Button
  29. android:id="@+id/view_btn"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:text="@string/s_view_btn"
  33. android:layout_gravity="bottom|right"/>
  34. </LinearLayout>
  1. publicclassMyListView4extendsListActivity{
  2. privateList<Map<String,Object>> mData;
  3. @Override
  4. publicvoid onCreate(Bundle savedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. mData = getData();
  7. MyAdapter adapter =newMyAdapter(this);
  8. setListAdapter(adapter);
  9. }
  10. privateList<Map<String,Object>> getData(){
  11. List<Map<String,Object>> list =newArrayList<Map<String,Object>>();
  12. Map<String,Object> map =null;
  13. map =newHashMap<String,Object>();
  14. map.put("title","G1");
  15. map.put("info","google 1");
  16. map.put("img", R.drawable.i1);
  17. list.add(map);
  18. map =newHashMap<String,Object>();
  19. map.put("title","G2");
  20. map.put("info","google 2");
  21. map.put("img", R.drawable.i2);
  22. list.add(map);
  23. map =newHashMap<String,Object>();
  24. map.put("title","G3");
  25. map.put("info","google 3");
  26. map.put("img", R.drawable.i3);
  27. list.add(map);
  28. return list;
  29. }
  30. // ListView 中某項被選中後的邏輯
  31. @Override
  32. protectedvoid onListItemClick(ListView l,View v,int position,long id){
  33. Log.v("MyListView4-click",(String)mData.get(position).get("title"));
  34. }
  35. //listview中點擊按鍵彈出對話框
  36. publicvoid showInfo(){
  37. newAlertDialog.Builder(this)
  38. .setTitle("個人listview")
  39. .setMessage("介紹...")
  40. .setPositiveButton("肯定",newDialogInterface.OnClickListener(){
  41. @Override
  42. publicvoid onClick(DialogInterface dialog,int which){
  43. }
  44. })
  45. .show();
  46. }
  47. /** 當Listie有大量的數據須要加載的時候,會佔據大量內存,影響性能,這時候 要按需填充並從新使用view來減小對象的建立
  48. *最快的方式是定義一個Pewholder,將convex的tag設置爲Pewholder,不爲空時從新使用便可
  49. */
  50. publicfinalclassViewHolder{
  51. publicImageView img;
  52. publicTextView title;
  53. publicTextView info;
  54. publicButton viewBtn;
  55. }
  56. publicclassMyAdapterextendsBaseAdapter{
  57. privateLayoutInflater mInflater;
  58. publicMyAdapter(Context context){
  59. this.mInflater =LayoutInflater.from(context);
  60. }
  61. @Override
  62. publicint getCount(){
  63. return mData.size();
  64. }
  65. @Override
  66. publicObject getItem(int arg0){
  67. returnnull;
  68. }
  69. @Override
  70. publiclong getItemId(int arg0){
  71. return0;
  72. }
  73. @Override
  74. publicView getView(int position,View convertView,ViewGroup parent){
  75. ViewHolder holder =null;
  76. if(convertView ==null){
  77. holder=newViewHolder();
  78. convertView = mInflater.inflate(R.layout.vlist2,null);
  79. holder.img =(ImageView)convertView.findViewById(R.id.img);
  80. holder.title =(TextView)convertView.findViewById(R.id.title);
  81. holder.info =(TextView)convertView.findViewById(R.id.info);
  82. holder.viewBtn =(Button)convertView.findViewById(R.id.view_btn);
  83. convertView.setTag(holder);
  84. }else{
  85. holder =(ViewHolder)convertView.getTag();
  86. }
  87. holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
  88. holder.title.setText((String)mData.get(position).get("title"));
  89. holder.info.setText((String)mData.get(position).get("info"));
  90. holder.viewBtn.setOnClickListener(newView.OnClickListener(){
  91. @Override
  92. publicvoid onClick(View v){
  93. showInfo();
  94. }
  95. });
  96. return convertView;
  97. }
  98. }
  99. }

下面將對上述代碼,作詳細的解釋
listView在開始繪製的時候,系統首先調用getCount()函數,根據他的返回值獲得listView的長度,而後根據這個長度,調用getView()逐一繪製每一行。若是你的getCount()返回值是0的話,列表將不顯示一樣return 1,就只顯示一行。佈局

系統顯示列表時,首先實例化一個適配器(這裏將實例化自定義的適配器)。當手動完成適配時,必須手動映射數據,這須要重寫getView()方法。系統在繪製列表的每一行的時候將調用此方法。
getView()有三個參數,position表示將顯示的是第幾行,covertView是從佈局文件中inflate來的佈局。咱們用LayoutInflater的方法將定義好的vlist2.xml文件提取成View實例用來顯示。而後將xml文件中的各個組件實例化(簡單的findViewById()方法)。這樣即可以將數據對應到各個組件上了。可是按鈕爲了響應點擊事件,須要爲它添加點擊監聽器,這樣就能捕獲點擊事件。至此一個自定義的listView就完成了,如今讓咱們回過頭重新審視這個過程。系統要繪製ListView了,他首先得到要繪製的這個列表的長度,而後開始繪製第一行,怎麼繪製呢?調用getView()函數。在這個函數裏面首先得到一個View(其實是一個ViewGroup),而後再實例並設置各個組件,顯示之。好了,繪製完這一行了。那再繪製下一行,直到繪完爲止。在實際的運行過程當中會發現listView的每一行沒有焦點了,這是由於Button搶奪了listView的焦點,只要佈局文件中將Button設置爲沒有焦點就OK了。性能



相關文章
相關標籤/搜索