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、看一下实现的效果