Android软件开发之ListView 详解

ListView的使用方法


ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘制出漂亮的列表,说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可以把列表中的数据映射到ListView中。
在android的开发中最Adapter 一共可以分为
ArrayAdapter<T>,
BaseAdapter, 
CursorAdapter,
HeaderViewListAdapter, 
ResourceCursorAdapter,
SimpleAdapter,
SimpleCursorAdapter,
WrapperListAdapter
软件开发中最常用的有ArrayAdapter<T>, BaseAdapter, SimpleAdapter,今天我用一段代码向大家诠释如何使用ListView控件。

232743hacqpwk7cpf0w0pe.gif

1.gif(50.2 KB, 下载次数: 120)

下载附件保存到相册

2011-9-2 23:27 上传


1.简单的ListView

       在List列表中如果不存在过于复杂的东西 我们可以直接去new ArrayAdapter() 来绘制列表,无须继承ArrayAdapter,重写它的方法。但是如果列表中过于复杂的话就需要使用自定义布局来实现List列表。
232754p93sz5akpqrav35z.gif

2.gif(34.67 KB, 下载次数: 107)

下载附件保存到相册

2011-9-2 23:27 上传

  1. public class SimpleList extends ListActivity {

  2.     private String[] mListStr = {"姓名:雨松MOMO","性别:男","年龄:25","居住地:北京","邮箱:xuanyusong@gmail.com"};

  3.     ListView mListView = null;

  4.     @Override

  5.     protected void onCreate(Bundle savedInstanceState) {

  6.         mListView = getListView();

  7.         setListAdapter(new ArrayAdapter<String>(this,

  8.                 android.R.layout.simple_list_item_1, mListStr));

  9.         mListView.setOnItemClickListener(new OnItemClickListener() {

  10.             @Override

  11.             public void onItemClick(AdapterView<?> adapterView, View view, int position,

  12.                     long id) {

  13.                 Toast.makeText(SimpleList.this,"您选择了" + mListStr[position], Toast.LENGTH_LONG).show();

  14.             }

  15.         });


  16.         super.onCreate(savedInstanceState);

  17.     }

  18. }

复制代码
2.带标题的ListView列表

      使用 simpleAdapter 需要注意的是须要用Map<String,Object> item 来保存列表中每一项的显示的title与text , new SimpleAdapter的时候将map中的数据写入 ,程序就会帮我们绘制列表了。
232756zuh3n2ehu0ul96n2.gif

3.gif(24.98 KB, 下载次数: 109)

下载附件保存到相册

2011-9-2 23:27 上传

  1. public class TitleList extends ListActivity {

  2.     private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};

  3.     private String[] mListStr = { "雨松MOMO", "男", "25", "北京",

  4.             "xuanyusong@gmail.com" };

  5.     ListView mListView = null;

  6.     ArrayList<Map<String,Object>> mData= new ArrayList<Map<String,Object>>();;


  7.     @Override

  8.     protected void onCreate(Bundle savedInstanceState) {

  9.         mListView = getListView();


  10.         int lengh = mListTitle.length;

  11.         for(int i =0; i < lengh; i++) {

  12.             Map<String,Object> item = new HashMap<String,Object>();

  13.             item.put("title", mListTitle[i]);

  14.             item.put("text", mListStr[i]);

  15.             mData.add(item); 

  16.         }

  17.         SimpleAdapter adapter = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2,

  18.                 new String[]{"title","text"},new int[]{android.R.id.text1,android.R.id.text2});

  19.         setListAdapter(adapter);

  20.         mListView.setOnItemClickListener(new OnItemClickListener() {

  21.             @Override

  22.             public void onItemClick(AdapterView<?> adapterView, View view, int position,

  23.                     long id) {

  24.                 Toast.makeText(TitleList.this,"您选择了标题:" + mListTitle[position] + "内容:"+mListStr[position], Toast.LENGTH_LONG).show();

  25.             }

  26.         });

  27.         super.onCreate(savedInstanceState);

  28.     }

  29. }

复制代码
3.带图片的ListView列表

        使用 simpleAdapter 来操作 但是构造simpleAdapter的时候须要使用我们自己写的布局来完成 ,因为系统的布局已经不能满足需求了,同样Map<String,Object> item 来保存列表中每一项须要的显示内容 如 图片 标题 内容等。

23275961rl68cunmzmwyrn.gif

4.gif(36.69 KB, 下载次数: 100)

下载附件保存到相册

2011-9-2 23:27 上传


添加我们自己的列表布局 图片 标题 内容  
  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" android:layout_height="?android:attr/listPreferredItemHeight">

  4.         <ImageView android:id="@+id/p_w_picpath"

  5.                 android:layout_width="wrap_content" android:layout_height="fill_parent"

  6.                 android:layout_alignParentTop="true" android:layout_alignParentBottom="true"

  7.                 android:adjustViewBounds="true"

  8.                 android:padding="2dip" />

  9.         <TextView android:id="@+id/title"

  10.                 android:layout_width="wrap_content" android:layout_height="wrap_content"

  11.                 android:layout_toRightOf="@+id/p_w_picpath"

  12.                 android:layout_alignParentRight="true" android:layout_alignParentTop="true"

  13.                 android:layout_above="@+id/text"

  14.                 android:layout_alignWithParentIfMissing="true" android:gravity="center_vertical"

  15.                 android:textSize="15dip" />

  16.         <TextView android:id="@+id/text"

  17.                 android:layout_width="fill_parent" android:layout_height="wrap_content"

  18.                 android:layout_toRightOf="@+id/p_w_picpath"

  19.                 android:layout_alignParentBottom="true"

  20.                 android:layout_alignParentRight="true" android:singleLine="true"

  21.                 android:ellipsize="marquee" 

  22.                 android:textSize="20dip" />

  23. </RelativeLayout>

  24.  

复制代码
  1. public class IconList extends ListActivity {

  2.     private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};

  3.     private String[] mListStr = { "雨松MOMO", "男", "25", "北京",

  4.             "xuanyusong@gmail.com" };

  5.     ListView mListView = null;

  6.     ArrayList<Map<String,Object>> mData= new ArrayList<Map<String,Object>>();;


  7.     @Override

  8.     protected void onCreate(Bundle savedInstanceState) {

  9.         mListView = getListView();


  10.         int lengh = mListTitle.length;

  11.         for(int i =0; i < lengh; i++) {

  12.             Map<String,Object> item = new HashMap<String,Object>();

  13.             item.put("p_w_picpath", R.drawable.jay);

  14.             item.put("title", mListTitle[i]);

  15.             item.put("text", mListStr[i]);

  16.             mData.add(item); 

  17.         }

  18.         SimpleAdapter adapter = new SimpleAdapter(this,mData,R.layout.iconlist,

  19.                 new String[]{"p_w_picpath","title","text"},new int[]{R.id.p_w_picpath,R.id.title,R.id.text});

  20.         setListAdapter(adapter);

  21.         mListView.setOnItemClickListener(new OnItemClickListener() {

  22.             @Override

  23.             public void onItemClick(AdapterView<?> adapterView, View view, int position,

  24.                     long id) {

  25.                 Toast.makeText(IconList.this,"您选择了标题:" + mListTitle[position] + "内容:"+mListStr[position], Toast.LENGTH_LONG).show();

  26.             }

  27.         });

  28.         super.onCreate(savedInstanceState);

  29.     }

  30. }

复制代码
4.自定义布局BaseAdapter修改列表颜色

       因为通过直接 构造系统的布局来绘制列表方法肯定是有限的,所以我们需要重写绘制方法 ,写一个类去继承BaseAdapter 并实现这个类中的方法,listView在一开始绘制的时候首先会调用getCout()方法得到绘制次数 ,然后会实例化自己定义的BaseAdapter通过getView()方法一层一层绘制ListView,所以我们可以在这里面根据position(当前绘制的ID)来任意的修改绘制的内容,做出好看漂亮的ListView,下面这个例子我通过重写getView修改每个列表的颜色 并且实现用户选中后成高亮状态。
232801vk791y7ps0zfvpq0.gif

5.gif(42 KB, 下载次数: 94)

下载附件保存到相册

2011-9-2 23:28 上传

  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" android:layout_height="wrap_content">

  4.         <ImageView android:id="@+id/color_p_w_picpath"

  5.                 android:layout_width="wrap_content" android:layout_height="fill_parent"

  6.                 android:layout_alignParentTop="true" android:layout_alignParentBottom="true"

  7.                 android:adjustViewBounds="true"

  8.                 android:padding="2dip" />

  9.         <TextView android:id="@+id/color_title"

  10.                 android:layout_width="fill_parent" android:layout_height="wrap_content"

  11.                 android:layout_toRightOf="@+id/color_p_w_picpath"

  12.                 android:layout_alignParentBottom="true"

  13.                 android:layout_alignParentRight="true" android:singleLine="true"

  14.                 android:ellipsize="marquee" 

  15.                 android:textSize="15dip"  />

  16.         <TextView android:id="@+id/color_text"

  17.                 android:layout_width="fill_parent" android:layout_height="wrap_content"

  18.                 android:layout_toRightOf="@+id/color_p_w_picpath"

  19.                 android:layout_below="@+id/color_title"

  20.                 android:layout_alignParentBottom="true"

  21.                 android:layout_alignParentRight="true" 

  22.                 android:singleLine="true"

  23.                 android:ellipsize="marquee" 

  24.                 android:textSize="20dip" />

  25. </RelativeLayout>


  26.  

复制代码
  1. public class ColorList extends ListActivity {

  2.     private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};

  3.     private String[] mListStr = { "雨松MOMO", "男", "25", "北京",

  4.             "xuanyusong@gmail.com" };

  5.     ListView mListView = null;

  6.     MyListAdapter myAdapter = null;

  7.     @Override

  8.     protected void onCreate(Bundle savedInstanceState) {

  9.         mListView = getListView();

  10.         myAdapter = new MyListAdapter(this);

  11.         setListAdapter(myAdapter);

  12.         mListView.setOnItemClickListener(new OnItemClickListener() {

  13.             @Override

  14.             public void onItemClick(AdapterView<?> adapterView, View view, int position,

  15.                     long id) {

  16.                 View v=adapterView.getChildAt(position);

  17.                 v.setBackgroundColor(Color.RED);

  18.                 Toast.makeText(ColorList.this,"您选择了" + mListStr[position], Toast.LENGTH_LONG).show();

  19.             }

  20.         });


  21.         super.onCreate(savedInstanceState);

  22.     }


  23.     class MyListAdapter extends BaseAdapter {

  24.         private int[] colors = new int[] { 0xff626569, 0xff4f5257 };

  25.         public MyListAdapter(Context context) {

  26.             mContext = context;

  27.         }


  28.         public int getCount() {

  29.             return mListStr.length;

  30.         }


  31.         @Override

  32.         public boolean areAllItemsEnabled() {

  33.             return false;

  34.         }


  35.         public Object getItem(int position) {

  36.             return position;

  37.         }


  38.         public long getItemId(int position) {

  39.             return position;

  40.         }


  41.         public View getView(int position, View convertView, ViewGroup parent) {

  42.             ImageView iamge = null;

  43.             TextView title = null;

  44.             TextView text = null;

  45.             if (convertView == null) {

  46.                 convertView = LayoutInflater.from(mContext).inflate(R.layout.colorlist, null);

  47.                 iamge = (ImageView) convertView.findViewById(R.id.color_p_w_picpath);

  48.                 title =(TextView) convertView.findViewById(R.id.color_title);

  49.                 text= (TextView) convertView.findViewById(R.id.color_text);

  50.             } 

  51.             int colorPos = position % colors.length;

  52.             convertView.setBackgroundColor(colors[colorPos]);

  53.             title.setText(mListTitle[position]);

  54.             text.setText(mListStr[position]);

  55.              iamge.setImageResource(R.drawable.jay);

  56.             return convertView;

  57.         }


  58.         private Context mContext;

  59.     }

  60. }

复制代码
5.自定义布局ArrayAdapter 
        ArrayAdapter是BaseAdapter的子类,ArrayAdapter不仅具有BaseAdapter的所有方法还自定义了一些新的方法来处理列表项,所以单纯的从功能能上来讲ArrayAdapter远远强与BaseAdapter,如果是绘制一些数量比较少的列表建议使用BaseAdapter 如果绘制一些比较复杂的列表项 并且列表项很多的 建议使用ArrayAdapter。
232804fo00744iv40i3v4c.gif

6.gif(44.97 KB, 下载次数: 94)

下载附件保存到相册

2011-9-2 23:28 上传

  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" android:layout_height="wrap_content">

  4.         <Button

  5.                 android:id="@+id/array_button"

  6.                 android:layout_width="wrap_content" 

  7.                 android:layout_height="wrap_content"

  8.             android:text="一个按钮"

  9.         />

  10.         <ImageView android:id="@+id/array_p_w_picpath"

  11.                 android:layout_toRightOf="@+id/array_button"

  12.                 android:layout_width="wrap_content" android:layout_height="fill_parent"

  13.                 android:layout_alignParentTop="true" android:layout_alignParentBottom="true"

  14.                 android:adjustViewBounds="true"

  15.                 android:padding="2dip" />

  16.         <TextView android:id="@+id/array_title"

  17.                 android:layout_width="fill_parent" android:layout_height="wrap_content"

  18.                 android:layout_toRightOf="@+id/array_p_w_picpath"

  19.                 android:layout_alignParentBottom="true"

  20.                 android:layout_alignParentRight="true" android:singleLine="true"

  21.                 android:ellipsize="marquee" 

  22.                 android:textSize="15dip"  />

  23.         <TextView android:id="@+id/array_text"

  24.                 android:layout_width="fill_parent" android:layout_height="wrap_content"

  25.                 android:layout_toRightOf="@+id/array_p_w_picpath"

  26.                 android:layout_below="@+id/array_title"

  27.                 android:layout_alignParentBottom="true"

  28.                 android:layout_alignParentRight="true" 

  29.                 android:singleLine="true"

  30.                 android:ellipsize="marquee" 

  31.                 android:textSize="20dip" />


  32. </RelativeLayout>

复制代码
  1. public class ArrayList extends ListActivity {

  2.     private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};

  3.     private String[] mListStr = { "雨松MOMO", "男", "25", "北京",

  4.             "xuanyusong@gmail.com" };

  5.     ListView mListView = null;

  6.     MyListAdapter myAdapter = null;

  7.     ArrayList arrayList = null;

  8.     @Override

  9.     protected void onCreate(Bundle savedInstanceState) {

  10.         arrayList = this;

  11.         mListView = getListView();

  12.         myAdapter = new MyListAdapter(this,R.layout.arraylist);

  13.         setListAdapter(myAdapter);

  14.         super.onCreate(savedInstanceState);

  15.     }


  16.     public class MyListAdapter extends ArrayAdapter<Object> {

  17.         int mTextViewResourceID = 0;

  18.         private Context mContext;

  19.         public MyListAdapter(Context context, int textViewResourceId) {

  20.             super(context, textViewResourceId);

  21.             mTextViewResourceID = textViewResourceId;

  22.             mContext = context;

  23.         }


  24.         private int[] colors = new int[] { 0xff626569, 0xff4f5257 };


  25.         public int getCount() {

  26.             return mListStr.length;

  27.         }


  28.         @Override

  29.         public boolean areAllItemsEnabled() {

  30.             return false;

  31.         }


  32.         public Object getItem(int position) {

  33.             return position;

  34.         }


  35.         public long getItemId(int position) {

  36.             return position;

  37.         }


  38.         public View getView(final int position, View convertView, ViewGroup parent) {

  39.             ImageView iamge = null;

  40.             TextView title = null;

  41.             TextView text = null;

  42.             Button button = null;

  43.             if (convertView == null) {

  44.                 convertView = LayoutInflater.from(mContext).inflate(

  45.                         mTextViewResourceID, null);

  46.                 iamge = (ImageView) convertView.findViewById(R.id.array_p_w_picpath);

  47.                 title = (TextView) convertView.findViewById(R.id.array_title);

  48.                 text = (TextView) convertView.findViewById(R.id.array_text);

  49.                 button = (Button)convertView.findViewById(R.id.array_button);

  50.                 button.setOnClickListener(new OnClickListener() {


  51.                     @Override

  52.                     public void onClick(View arg0) {

  53.                         Toast.makeText(arrayList,"您点击的第"+position +"个按钮", Toast.LENGTH_LONG).show();


  54.                     }

  55.                 });

  56.             }

  57.             int colorPos = position % colors.length;

  58.             convertView.setBackgroundColor(colors[colorPos]);

  59.             title.setText(mListTitle[position]);

  60.             text.setText(mListStr[position]);

  61.             if(colorPos == 0)

  62.                 iamge.setImageResource(R.drawable.jay);

  63.             else

  64.                 iamge.setImageResource(R.drawable.p_w_picpath);

  65.             return convertView;

  66.         }

  67.     }

  68. }