【Android控件】ListView

13年前

一、ListView介绍

 

ListView是类似于将一个界面分为一行一行,如下图:

 

ListView只是一个视图,而如果要在这个列表视图中显示数据,则必须要通过“Adapter”,我们通常有三种Adapter:

(1)ArrayAdapter:每行只能是一个文本;

(2)SimpleAdapter:此种方式不是很好,经过测试,只能显示一行数据;

(3)继承BaseAdapter:此种方式较灵活,可以自定义将每行对应到不同的布局xml中;

 

 

二、ListView实例

 

这个实例分别实现了三种ListView的使用;

工程的层次结构如下:

 

ListView的界面如图所示:

 

ArrayAdapter的显示界面如下:

 

SimpleAdapter的界面如下:

 

ExtendBaseAdapter的界面如下:

 

 

1.主界面模块:

 

ListViewActivity.java

 

  1. package org.xiazdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.ArrayAdapter;  
  9. import android.widget.Button;  
  10.   
  11. public class ListViewActivity extends Activity implements OnClickListener{  
  12.     private Button btn1;  
  13.     private Button btn2;  
  14.     private Button btn3;  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);              //一定要先setContentView,才findViewById  
  19.         btn1 = (Button) this.findViewById(R.id.arrayAdapter);  
  20.         btn2 = (Button) this.findViewById(R.id.simpleAdapter);  
  21.         btn3 = (Button)this.findViewById(R.id.baseAdapter);  
  22.         btn1.setOnClickListener(this);  
  23.         btn2.setOnClickListener(this);  
  24.         btn3.setOnClickListener(this);  
  25.     }  
  26.   
  27.     @Override  
  28.     public void onClick(View v) {  
  29.         if(v==btn1){  
  30.             Intent intent = new Intent(ListViewActivity.this,ArrayAdapterActivity.class);  
  31.             this.startActivity(intent);  
  32.         }  
  33.         else if(v==btn2){  
  34.             Intent intent = new Intent(ListViewActivity.this,SimpleAdapterActivity.class);  
  35.             this.startActivity(intent);  
  36.         }  
  37.         else if(v==btn3){  
  38.             Intent intent = new Intent(ListViewActivity.this,ExtendBaseAdapterActivity.class);  
  39.             this.startActivity(intent);  
  40.         }  
  41.     }  
  42. }  


main.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tv"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_centerHorizontal="true"  
  12.         android:text="ListView的使用"  
  13.         android:textSize="50px" />  
  14.   
  15.     <Button  
  16.         android:id="@+id/arrayAdapter"  
  17.         android:layout_width="fill_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_below="@id/tv"  
  20.         android:text="ArrayAdapter" >  
  21.     </Button>  
  22.   
  23.     <Button  
  24.         android:id="@+id/simpleAdapter"  
  25.         android:layout_width="fill_parent"  
  26.         android:layout_height="wrap_content"  
  27.         android:layout_below="@id/arrayAdapter"  
  28.         android:text="SimpleAdapter" >  
  29.     </Button>  
  30.     <Button  
  31.         android:id="@+id/baseAdapter"  
  32.         android:layout_width="fill_parent"  
  33.         android:layout_height="wrap_content"  
  34.         android:layout_below="@id/simpleAdapter"  
  35.         android:text="ExtendBaseAdapter" >  
  36.     </Button>  
  37.     <TextView  
  38.         android:id="@+id/textView1"  
  39.         android:layout_width="wrap_content"  
  40.         android:layout_height="wrap_content"  
  41.         android:layout_alignParentBottom="true"  
  42.         android:layout_alignParentRight="true"  
  43.         android:layout_marginBottom="142dp"  
  44.         android:layout_marginRight="16dp"  
  45.         android:text="by xiazdong"  
  46.         android:textSize="20px" />  
  47.   
  48. </RelativeLayout>  

 


2.ArrayAdapter模块

 

ArrayAdapterActivity.java

 

  1. package org.xiazdong;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.widget.ArrayAdapter;  
  9. import android.widget.ListView;  
  10.   
  11. /* 
  12.  * 每创建一个Activity就要在AndroidManifest.xml中声明 
  13.  * ArrayAdapter只能显示基本的字符串 
  14.  * SimpleAdapter能够显示自定义视图 
  15.  */  
  16. public class ArrayAdapterActivity extends Activity {  
  17.     private ListView lv;  
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.   
  21.         super.onCreate(savedInstanceState);  
  22.   
  23.         lv = new ListView(this);   //ListView继承View  
  24.         List<String> list = new ArrayList<String>();  
  25.         for (int i = 0; i < 10; i++) {  
  26.             list.add("xiazdong-" + i);  
  27.         }  
  28.         ArrayAdapter<String> sa = new ArrayAdapter<String>(this,   //将List赋给ArrayAdapter,采用simple_item_1样式  
  29.                 android.R.layout.simple_list_item_1, list);  
  30.         lv.setAdapter(sa);  //将ArrayAdapter的值映射到ListView中  
  31.         this.setContentView(lv);  
  32.     }  
  33. }  


 

3.SimpleAdapter模块

 

SimpleAdapterActivity.java

 

  1. package org.xiazdong;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.widget.ListView;  
  11. import android.widget.SimpleAdapter;  
  12.   
  13. public class SimpleAdapterActivity extends Activity {  
  14.   
  15.     private ListView lv;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle saveBundle) {  
  19.         super.onCreate(saveBundle);  
  20.         lv = new ListView(this);  
  21.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  22.         Map<String, Object> map1 = new HashMap<String, Object>();  
  23.         map1.put("name1", "xiazdong-1");  
  24.         map1.put("button1", "按钮1");  
  25.         list.add(map1);  
  26.         SimpleAdapter sa = new SimpleAdapter(this, list, R.layout.simple,  
  27.                 new String[] { "name1", "button1"}, new int[] { R.id.tv1,  
  28.                         R.id.btn1 });  
  29.         lv.setAdapter(sa);  
  30.         this.setContentView(lv);  
  31.     }  
  32. }  


 

simple.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.   
  7.   
  8.     <TextView  
  9.         android:id="@+id/tv1"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="TextView" />  
  13.   
  14.     <Button  
  15.         android:id="@+id/btn1"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:text="Button" />  
  19.   
  20. </LinearLayout>  


 

 

4.ExtendBaseAdapter模块

 

ExtendBaseAdapterActivity.java

 

  1. package org.xiazdong;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.widget.ArrayAdapter;  
  9. import android.widget.ListView;  
  10.   
  11. public class ExtendBaseAdapterActivity extends Activity {  
  12.     private ListView lv;  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         lv = new ListView(this);  
  17.         MyAdapter ma = new MyAdapter(thisnew int[] { R.layout.sub1,  
  18.                 R.layout.sub2 }); // 分别在每行中显示sub1的布局和sub2的布局  
  19.         lv.setAdapter(ma);  
  20.         this.setContentView(lv);  
  21.     }  
  22. }  


 

MyAdapter.java

 

  1. package org.xiazdong;  
  2.   
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.view.ViewGroup;  
  8. import android.widget.BaseAdapter;  
  9. import android.widget.Button;  
  10. import android.widget.CheckBox;  
  11. import android.widget.CompoundButton;  
  12. import android.widget.CompoundButton.OnCheckedChangeListener;  
  13. import android.widget.Toast;  
  14.   
  15. public class MyAdapter extends BaseAdapter {  
  16.     private Context context;  
  17.     private int layoutID[];  
  18.     private LayoutInflater inflator;  
  19.     public MyAdapter(Context context, int layoutID[]) {  
  20.         this.context = context;  
  21.         this.layoutID = layoutID;  
  22.         inflator = LayoutInflater.from(context);  
  23.     }  
  24.     @Override  
  25.     public int getCount() { // 一个布局占一行  
  26.         return layoutID.length;  
  27.     }  
  28.   
  29.     @Override  
  30.     public Object getItem(int position) {  
  31.         return null;  
  32.     }  
  33.   
  34.     @Override  
  35.     public long getItemId(int position) {  
  36.         return 0;  
  37.     }  
  38.   
  39.     @Override  
  40.     // position表示要显示第几行,0表示第一行  
  41.     // convertView表示要显示的视图  
  42.     public View getView(int position, View convertView, ViewGroup parent) {  
  43.         convertView = inflator.inflate(layoutID[position], null);//每次将一个布局xml映射到一项中  
  44.         if (convertView.findViewById(R.id.checkBox1) instanceof CheckBox) {  
  45.             CheckBox cb1 = (CheckBox) convertView.findViewById(R.id.checkBox1);  
  46.             cb1.setOnCheckedChangeListener(new OnCheckedChangeListener() {  
  47.   
  48.                 @Override  
  49.                 public void onCheckedChanged(CompoundButton buttonView,  
  50.                         boolean isChecked) {  
  51.                     Toast t = Toast.makeText(context, "点击了复选框", Toast.LENGTH_SHORT);  
  52.                     t.show();  
  53.                 }  
  54.             });  
  55.         }  
  56.         if (convertView.findViewById(R.id.button1) instanceof Button) {  
  57.             Button b1 = (Button) convertView.findViewById(R.id.button1);  
  58.             b1.setOnClickListener(new OnClickListener() {  
  59.   
  60.                 @Override  
  61.                 public void onClick(View v) {  
  62.                     Toast t = Toast.makeText(context, "点击了按钮", Toast.LENGTH_SHORT);  
  63.                     t.show();  
  64.                 }  
  65.             });  
  66.         }  
  67.         return convertView;  
  68.   
  69.     }  
  70.   
  71. }  


 

sub1.xml

 

  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="match_parent" >  
  5.   
  6.      
  7.     <TextView  
  8.         android:id="@+id/textView1"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_alignBaseline="@+id/checkBox1"  
  12.         android:layout_alignBottom="@+id/checkBox1"  
  13.         android:layout_alignParentLeft="true"  
  14.         android:text="点击弹出提示" />  
  15.     <CheckBox  
  16.         android:id="@+id/checkBox1"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignParentRight="true"  
  20.         android:layout_alignParentTop="true"  
  21.         android:text="" />  
  22.       
  23.       
  24. </RelativeLayout>  


 

sub2.xml

 

  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="match_parent" >  
  5.     <TextView  
  6.         android:id="@+id/textView2"  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"  
  9.         android:layout_alignBaseline="@+id/button1"  
  10.         android:layout_alignBottom="@+id/button1"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:text="TextView" />  
  13.     <Button  
  14.         android:id="@+id/button1"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_alignParentRight="true"  
  18.         android:layout_alignParentTop="true"  
  19.         android:text="Button" />  
  20. </RelativeLayout>  


 

总结:

 

ListView的应用有很多,比如

(1)在一般的游戏中列出排行榜;

(2)“设置”中列出多种子设置;

(3)字典列出单词;

 

 

 

(4)通讯录列表;