ListView的幾種適配器及自定義適配器


 ListView是我們在Android應用開發中常用的組件,它通過列表的形式展示數據,具有很強的可擴展性,通常使用還會給每一項綁定一個點擊時間,用於處理相應的請求,ListView在電商的商品列表中是必不可少的,下面我們介紹幾種常用的使用方法。

 列表的顯示需要三個元素:

          1.ListVeiw   用來展示列表的View。
          2.適配器       用來把數據映射到ListView上的中介。
          3.數據           具體的將被映射的字符串,圖片,或者基本組件。
 
android中我們常用的有3中不同的適配器,分別是:
1.ArrayAdapter   使用最為簡單,以數據集合為基礎,只顯示一行文本。
2.SimpleAdapter  具有很好的擴種行,可以自定義出各種各樣的布局。
3.SimpleCursorAdapter   可以方便的把數據庫的內容通過列表的形式展現出來
 
另外,我們通常自己寫一個繼承自BaseAdapter(基礎適配器)的適配器,用於將設計思路更加的符合規范,數據與視圖分離開來,像MVC一樣。
 
下面我們逐一介紹着幾種方式:
 
(一)、ArrayAdapter適配器
ArrayAdapter可以實現簡單的數據與ListView的綁定,我們逐步實現ListView。
 
1、在布局文件中加入一個ListView組件
 
[html]  view plain  copy
 
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent" >  
  10.     </ListView>  
  11.   
  12. </RelativeLayout>  

2、在Activity中分別獲取列表、數據、適配器。
 
[java]  view plain  copy
 
 
  1. public class MainActivity extends Activity {  
  2.   
  3. private ListView myListView;//列表  
  4. private List<String> itemList;//數據  
  5.   
  6. @Override  
  7. protected void onCreate(Bundle savedInstanceState) {  
  8. super.onCreate(savedInstanceState);  
  9. setContentView(R.layout.activity_main);  
  10. initData();  
  11. myListView = (ListView) findViewById(R.id.listView);  
  12. //ArrayAdapter中有三個參數  
  13. //Context context 指定現在的上下文  
  14. //int textViewResourceId 指定一個包含textview的布局文件,顯示每行的信息  
  15. //List<String> objects 在listview上顯示的數據信息  
  16. ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(MainActivity.this,  
  17. android.R.layout.simple_list_item_1, itemList);//適配器  
  18. }  
  19.   
  20. public void initData() {  
  21. itemList = new ArrayList<String>();  
  22. for (int i = 0; i < 20; i++) {  
  23. itemList.add("測試數據" + i);  
  24. }  
  25. }  
  26. }  

3、看一下實現的效果
 
可以看到,listView中的每一項都只顯示了一行信息,這種適配器,在需要顯示每項內容只有一個時比較常用,一般我們的listView中每項都有較多的內容,所以還需要更加充實的適配器。
 
(二)、SimpleAdapter適配器
      這是一個簡單的適配器,可以將靜態數據映射到XML文件中定義好的視圖。你可以指定由Map組成的List(比如ArrayList)類型的數據。在ArrayList中的每個條目對應List中的一行。Maps包含每一行的數據。你可以指定一個XML布局以指定每一行的視圖,根據Map中的數據映射關鍵字到指定的視圖。綁定數據到視圖分兩個階段,首先,如果設置了SimpleAdapter.ViewBinder,那么這個設置的ViewBinder的setViewValue(android.view.View, Object, String)將被調用。如果setViewValue的返回值是true,則表示綁定已經完成,將不再調用系統默認的綁定實現。如果返回值為false,視圖將按以下順序綁定數據:
• 如果View實現了Checkable(例如CheckBox),期望綁定值是一個布爾類型。
• TextView.期望綁定值是一個字符串類型,通過調用setViewText(TextView, String)綁定。
• ImageView,期望綁定值是一個資源id或者一個字符串,通過調用setViewImage(ImageView, int) 或 setViewImage(ImageView, String)綁定數據。
  如果沒有一個合適的綁定發生將會拋出IllegalStateException。
1、在布局文件中加入一個ListView組件
[html]  view plain  copy
 
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent" >  
  10.     </ListView>  
  11.   
  12. </RelativeLayout>  
 
2、自定義一個ListView每一項的布局,里面放一個圖片和兩個文本。
[html]  view plain  copy
 
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="@android:color/white" >  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/item_image"  
  9.         android:layout_width="80dp"  
  10.         android:layout_height="80dp"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:layout_centerVertical="true"  
  13.         android:padding="5dp"  
  14.         android:scaleType="fitXY"  
  15.         android:src="@drawable/bank_boc" />  
  16.   
  17.     <LinearLayout  
  18.         android:layout_width="fill_parent"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_centerVertical="true"  
  21.         android:layout_toRightOf="@id/item_image"  
  22.         android:layout_marginLeft="10dp"  
  23.         android:orientation="vertical" >  
  24.   
  25.         <TextView  
  26.             android:id="@+id/item_title"  
  27.             android:layout_width="fill_parent"  
  28.             android:layout_height="wrap_content"  
  29.             android:text="標題"  
  30.             android:textColor="#000"  
  31.             android:textSize="25sp" />  
  32.   
  33.         <TextView  
  34.             android:id="@+id/item_data"  
  35.             android:layout_width="fill_parent"  
  36.             android:layout_height="wrap_content"  
  37.             android:text="內容"  
  38.             android:textColor="#222"  
  39.             android:textSize="20sp" />  
  40.     </LinearLayout>  
  41.   
  42. </RelativeLayout>  

效果如下:
 
3、在Activity中使用SimpleAdapter
 
[java]  view plain  copy
 
 
  1. public class SimpleAdapterListActivity extends Activity {  
  2.   
  3. private ListView myListView;  
  4. private List<HashMap<String, Object>> data;  
  5. private final String TITLE = "title";  
  6. private final String IMAGE = "image";  
  7. private final String DATA = "data";  
  8.   
  9. @Override  
  10. protected void onCreate(Bundle savedInstanceState) {  
  11. // TODO Auto-generated method stub  
  12. super.onCreate(savedInstanceState);  
  13. setContentView(R.layout.activity_main);  
  14. myListView = (ListView) findViewById(R.id.listView);  
  15.   
  16. initData();  
  17. // 參數:  
  18. // context  SimpleAdapter關聯的View的運行環境  
  19. // data    一個Map組成的List。在列表中的每個條目對應列表中的一行,每一個map中應該包含所有在from參數中指定的鍵  
  20. // resource 一個定義列表項的布局文件的資源ID。布局文件將至少應包含那些在to中定義了的ID  
  21. // from 一個將被添加到Map映射上的鍵名  
  22. // to     將綁定數據的視圖的ID,跟from參數對應,這些應該全是TextView  
  23. SimpleAdapter simAdapter = new SimpleAdapter(  
  24. SimpleAdapterListActivity.this, data, R.layout.item_listsimple,  
  25. new String[] { TITLE, DATA, IMAGE }, new int[] {  
  26. R.id.item_title, R.id.item_data, R.id.item_image });  
  27. myListView.setAdapter(simAdapter);  
  28. }  
  29.   
  30. public void initData() {  
  31. data = new ArrayList<HashMap<String, Object>>();  
  32. for (int i = 0; i < 20; i++) {  
  33. HashMap<String, Object> mapItem = new HashMap<String, Object>();  
  34. mapItem.put(TITLE, "標題" + i);  
  35. mapItem.put(DATA, "介紹" + i);  
  36. switch (i % 3) {  
  37. case 0:  
  38. mapItem.put(IMAGE, R.drawable.bank_boc);  
  39. break;  
  40. case 1:  
  41. mapItem.put(IMAGE, R.drawable.bank_fjnx);  
  42. break;  
  43. case 2:  
  44. mapItem.put(IMAGE, R.drawable.bank_visa);  
  45. break;  
  46. default:  
  47. break;  
  48. }  
  49. data.add(mapItem);  
  50. }  
  51. }  
  52. }  

4、看一下效果
 
(三)、SimpleCursorAdapter適配器
 
SimpleCursorAdapter是android中專門為連接數據庫與視圖產生的,我們下面測試下使用SimpleCursorAdapter取到手機中的聯系人。
1、在布局文件中加入一個ListView組件
[html]  view plain  copy
 
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent" >  
  10.     </ListView>  
  11.   
  12. </RelativeLayout>  
 
2、在Activity中添加相應代碼
[java]  view plain  copy
 
 
  1. public class SimpleCursorActivity extends Activity {  
  2.   
  3. private ListView myListView;  
  4.   
  5. @Override  
  6. protected void onCreate(Bundle savedInstanceState) {  
  7. // TODO Auto-generated method stub  
  8. super.onCreate(savedInstanceState);  
  9. setContentView(R.layout.activity_main);  
  10. myListView = (ListView)findViewById(R.id.listView);  
  11. @SuppressWarnings("deprecation")  
  12. Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);  
  13.         startManagingCursor(cursor);  
  14.         ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1, cursor, new String[]{People.NAME}, new int[]{android.R.id.text1});  
  15.         myListView.setAdapter(listAdapter);  
  16. }  
  17. }  

3、讀取聯系人要用到權限,在AndroidMenifest.xml中添加權限
[html]  view plain  copy
 
 
  1. <uses-permission android:name="android.permission.READ_CONTACTS"/>  

4、在模擬器中加入一條聯系人數據,可以看到運行后效果
 
 
(四)、自定義適配器
     在我們實際的應用中,通常使用自定義適配器,自定義適配器繼承BaseAdapter,下面我們使用自定義的Adapter來實現(二)中介紹的SimpleAdapter的效果,
1、Activity的界面文件
[html]  view plain  copy
 
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent" >  
  10.     </ListView>  
  11.   
  12. </RelativeLayout>  

2、ListView每一項的布局文件
[html]  view plain  copy
 
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="@android:color/white" >  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/item_image"  
  9.         android:layout_width="80dp"  
  10.         android:layout_height="80dp"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:layout_centerVertical="true"  
  13.         android:padding="5dp"  
  14.         android:scaleType="fitXY"  
  15.         android:src="@drawable/bank_boc" />  
  16.   
  17.     <LinearLayout  
  18.         android:layout_width="fill_parent"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_centerVertical="true"  
  21.         android:layout_toRightOf="@id/item_image"  
  22.         android:layout_marginLeft="10dp"  
  23.         android:orientation="vertical" >  
  24.   
  25.         <TextView  
  26.             android:id="@+id/item_title"  
  27.             android:layout_width="fill_parent"  
  28.             android:layout_height="wrap_content"  
  29.             android:text="標題"  
  30.             android:textColor="#000"  
  31.             android:textSize="25sp" />  
  32.   
  33.         <TextView  
  34.             android:id="@+id/item_data"  
  35.             android:layout_width="fill_parent"  
  36.             android:layout_height="wrap_content"  
  37.             android:text="內容"  
  38.             android:textColor="#222"  
  39.             android:textSize="20sp" />  
  40.     </LinearLayout>  
  41.   
  42. </RelativeLayout>  

3、定義一個java類,用來存放在listItem中的每項數據
 
[java]  view plain  copy
 
 
  1. public class ListItemModel {  
  2.   
  3. private String title;  
  4. private String data;  
  5. private int rid;  
  6.   
  7. public String getTitle() {  
  8. return title;  
  9. }  
  10.   
  11. public void setTitle(String title) {  
  12. this.title = title;  
  13. }  
  14.   
  15. public String getData() {  
  16. return data;  
  17. }  
  18.   
  19. public void setData(String data) {  
  20. this.data = data;  
  21. }  
  22.   
  23. public int getRid() {  
  24. return rid;  
  25. }  
  26.   
  27. public void setRid(int rid) {  
  28. this.rid = rid;  
  29. }  
  30.   
  31. }  

4、自定義適配器
 
[java]  view plain  copy
 
 
  1. public class MyListAdapter extends BaseAdapter {  
  2.   
  3. private List<ListItemModel> listItems;  
  4. private LayoutInflater layoutInflater;  
  5.   
  6. public MyListAdapter(Context context) {  
  7. layoutInflater = LayoutInflater.from(context);  
  8. }  
  9.   
  10. public List<ListItemModel> getListItems() {  
  11. return listItems;  
  12. }  
  13.   
  14. public void setListItems(List<ListItemModel> listItems) {  
  15. this.listItems = listItems;  
  16. }  
  17.   
  18. @Override  
  19. public int getCount() {  
  20. // TODO Auto-generated method stub  
  21. return listItems.size();  
  22. }  
  23.   
  24. @Override  
  25. public Object getItem(int position) {  
  26. // TODO Auto-generated method stub  
  27. return null;  
  28. }  
  29.   
  30. @Override  
  31. public long getItemId(int position) {  
  32. // TODO Auto-generated method stub  
  33. return 0;  
  34. }  
  35.   
  36. @Override  
  37. public View getView(int position, View convertView, ViewGroup parent) {  
  38. // TODO Auto-generated method stub  
  39. ListItemView myListItemView;  
  40. if (convertView == null) {  
  41. myListItemView = new ListItemView();  
  42. convertView = layoutInflater  
  43. .inflate(R.layout.item_listsimple, null);  
  44. myListItemView.setTv_title((TextView) convertView  
  45. .findViewById(R.id.item_title));  
  46. myListItemView.setTv_data((TextView) convertView  
  47. .findViewById(R.id.item_data));  
  48. myListItemView.setIv_image((ImageView) convertView  
  49. .findViewById(R.id.item_image));  
  50. convertView.setTag(myListItemView);  
  51. else {  
  52. myListItemView = (ListItemView) convertView.getTag();  
  53. }  
  54. myListItemView.getTv_title()  
  55. .setText(listItems.get(position).getTitle());  
  56. myListItemView.getTv_data().setText(listItems.get(position).getData());  
  57. myListItemView.getIv_image().setImageResource(  
  58. listItems.get(position).getRid());  
  59.   
  60. return convertView;  
  61. }  
  62.   
  63. class ListItemView {  
  64. private TextView tv_title;  
  65. private TextView tv_data;  
  66. private ImageView iv_image;  
  67.   
  68. public TextView getTv_title() {  
  69. return tv_title;  
  70. }  
  71.   
  72. public void setTv_title(TextView tv_title) {  
  73. this.tv_title = tv_title;  
  74. }  
  75.   
  76. public TextView getTv_data() {  
  77. return tv_data;  
  78. }  
  79.   
  80. public void setTv_data(TextView tv_data) {  
  81. this.tv_data = tv_data;  
  82. }  
  83.   
  84. public ImageView getIv_image() {  
  85. return iv_image;  
  86. }  
  87.   
  88. public void setIv_image(ImageView iv_image) {  
  89. this.iv_image = iv_image;  
  90. }  
  91. }  
  92. }  

5、Activity中添加數據和適配器,並與ListView綁定
[java]  view plain  copy
 
 
  1. public class MyAdapterActivity extends Activity {  
  2.   
  3. private ListView listView;  
  4. private String[] str_titles = { "自定義標題1", "自定義標題2", "自定義標題3", "自定義標題4",  
  5. "自定義標題5", "自定義標題6", "自定義標題7", "自定義標題8", "自定義標題9" };  
  6. private String[] str_datas = { "我的內容1", "我的內容2", "我的內容3", "我的內容4", "我的內容5",  
  7. "我的內容6", "我的內容7", "我的內容8", "我的內容9" };  
  8. private int[] rids = { R.drawable.bank_boc, R.drawable.bank_fjnx,  
  9. R.drawable.bank_visa, R.drawable.bank_boc, R.drawable.bank_fjnx,  
  10. R.drawable.bank_visa, R.drawable.bank_boc, R.drawable.bank_fjnx,  
  11. R.drawable.bank_visa };  
  12.   
  13. private List<ListItemModel> myListItems;  
  14. private MyListAdapter adapter;  
  15.   
  16. @Override  
  17. protected void onCreate(Bundle savedInstanceState) {  
  18. // TODO Auto-generated method stub  
  19. super.onCreate(savedInstanceState);  
  20. setContentView(R.layout.activity_main);  
  21. listView = (ListView) findViewById(R.id.listView);  
  22. myListItems = new ArrayList<ListItemModel>();  
  23. initData();  
  24. adapter = new MyListAdapter(MyAdapterActivity.this);  
  25. adapter.setListItems(myListItems);  
  26. listView.setAdapter(adapter);  
  27. listView.setOnItemClickListener(new OnItemClickListener() {  
  28.   
  29. @Override  
  30. public void onItemClick(AdapterView<?> parent, View view,  
  31. int position, long id) {  
  32. // TODO Auto-generated method stub  
  33. Toast.makeText(MyAdapterActivity.this, "點擊了" + position, 1000)  
  34. .show();  
  35. }  
  36. });  
  37. }  
  38.   
  39. public void initData() {  
  40. for (int i = 0; i < str_titles.length; i++) {  
  41. ListItemModel lm = new ListItemModel();  
  42. lm.setTitle(str_titles[i]);  
  43. lm.setData(str_datas[i]);  
  44. lm.setRid(rids[i]);  
  45. myListItems.add(lm);  
  46. }  
  47. }  
  48.   
  49. }  

6、看一下實現的效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM