Android软件开发之ListView 详解 (十一)

393
回复
1505958
查看
  [复制链接]

249

主题

278

帖子

17

安币

初级码农

Rank: 1

发表于 2011-9-2 23:29:40 | 显示全部楼层 |阅读模式
本帖最后由 hello.liu 于 2011-9-2 23:31 编辑

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控件。

1.简单的ListView

       在List列表中如果不存在过于复杂的东西 我们可以直接去new ArrayAdapter() 来绘制列表,无须继承ArrayAdapter,重写它的方法。但是如果列表中过于复杂的话就需要使用自定义布局来实现List列表。
  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中的数据写入 ,程序就会帮我们绘制列表了。
  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.       
  11.         int lengh = mListTitle.length;
  12.         for(int i =0; i < lengh; i++) {
  13.             Map<String,Object> item = new HashMap<String,Object>();
  14.             item.put("title", mListTitle[i]);
  15.             item.put("text", mListStr[i]);
  16.             mData.add(item);
  17.         }
  18.         SimpleAdapter adapter = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2,
  19.                 new String[]{"title","text"},new int[]{android.R.id.text1,android.R.id.text2});
  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(TitleList.this,"您选择了标题:" + mListTitle[position] + "内容:"+mListStr[position], Toast.LENGTH_LONG).show();
  26.             }
  27.         });
  28.         super.onCreate(savedInstanceState);
  29.     }
  30. }
复制代码
3.带图片的ListView列表

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


添加我们自己的列表布局 图片 标题 内容
  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/image"
  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/image"
  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/image"
  19.                 android:layout_alignParentBottom="true"
  20.                 android:layout_alignParentRight="true" android:singleLine="true"
  21.                 android:ellipsize="marquee"
  22.                 android:textSize="20dip" />
  23. </RelativeLayout>
复制代码
  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.       
  11.         int lengh = mListTitle.length;
  12.         for(int i =0; i < lengh; i++) {
  13.             Map<String,Object> item = new HashMap<String,Object>();
  14.             item.put("image", R.drawable.jay);
  15.             item.put("title", mListTitle[i]);
  16.             item.put("text", mListStr[i]);
  17.             mData.add(item);
  18.         }
  19.         SimpleAdapter adapter = new SimpleAdapter(this,mData,R.layout.iconlist,
  20.                 new String[]{"image","title","text"},new int[]{R.id.image,R.id.title,R.id.text});
  21.         setListAdapter(adapter);
  22.         mListView.setOnItemClickListener(new OnItemClickListener() {
  23.             @Override
  24.             public void onItemClick(AdapterView<?> adapterView, View view, int position,
  25.                     long id) {
  26.                 Toast.makeText(IconList.this,"您选择了标题:" + mListTitle[position] + "内容:"+mListStr[position], Toast.LENGTH_LONG).show();
  27.             }
  28.         });
  29.         super.onCreate(savedInstanceState);
  30.     }
  31. }
复制代码
4.自定义布局BaseAdapter修改列表颜色

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

复制代码
  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.        
  22.         super.onCreate(savedInstanceState);
  23.     }

  24.     class MyListAdapter extends BaseAdapter {
  25.         private int[] colors = new int[] { 0xff626569, 0xff4f5257 };
  26.         public MyListAdapter(Context context) {
  27.             mContext = context;
  28.         }

  29.         public int getCount() {
  30.             return mListStr.length;
  31.         }

  32.         @Override
  33.         public boolean areAllItemsEnabled() {
  34.             return false;
  35.         }

  36.         public Object getItem(int position) {
  37.             return position;
  38.         }

  39.         public long getItemId(int position) {
  40.             return position;
  41.         }

  42.         public View getView(int position, View convertView, ViewGroup parent) {
  43.             ImageView iamge = null;
  44.             TextView title = null;
  45.             TextView text = null;
  46.             if (convertView == null) {
  47.                 convertView = LayoutInflater.from(mContext).inflate(R.layout.colorlist, null);
  48.                 iamge = (ImageView) convertView.findViewById(R.id.color_image);
  49.                 title =(TextView) convertView.findViewById(R.id.color_title);
  50.                 text= (TextView) convertView.findViewById(R.id.color_text);
  51.             }
  52.             int colorPos = position % colors.length;
  53.             convertView.setBackgroundColor(colors[colorPos]);
  54.             title.setText(mListTitle[position]);
  55.             text.setText(mListStr[position]);
  56.              iamge.setImageResource(R.drawable.jay);
  57.             return convertView;
  58.         }

  59.         private Context mContext;
  60.     }
  61. }
复制代码
5.自定义布局ArrayAdapter
        ArrayAdapter是BaseAdapter的子类,ArrayAdapter不仅具有BaseAdapter的所有方法还自定义了一些新的方法来处理列表项,所以单纯的从功能能上来讲ArrayAdapter远远强与BaseAdapter,如果是绘制一些数量比较少的列表建议使用BaseAdapter 如果绘制一些比较复杂的列表项 并且列表项很多的 建议使用ArrayAdapter。
  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_image"
  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_image"
  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_image"
  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_image);
  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.                     
  52.                     @Override
  53.                     public void onClick(View arg0) {
  54.                         Toast.makeText(arrayList,"您点击的第"+position +"个按钮", Toast.LENGTH_LONG).show();
  55.                        
  56.                     }
  57.                 });
  58.             }
  59.             int colorPos = position % colors.length;
  60.             convertView.setBackgroundColor(colors[colorPos]);
  61.             title.setText(mListTitle[position]);
  62.             text.setText(mListStr[position]);
  63.             if(colorPos == 0)
  64.                 iamge.setImageResource(R.drawable.jay);
  65.             else
  66.                 iamge.setImageResource(R.drawable.image);
  67.             return convertView;
  68.         }
  69.     }
  70. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

14

主题

360

帖子

204

安币

攻城狮

Rank: 3Rank: 3

发表于 2011-9-7 14:55:30 | 显示全部楼层
Android软件开发之ListView 详解 (十一)

0

主题

72

帖子

69

安币

程序猿

Rank: 2

发表于 2011-9-9 10:18:27 | 显示全部楼层
不错。收藏了。呵呵

0

主题

74

帖子

144

安币

程序猿

Rank: 2

发表于 2011-9-12 16:01:10 | 显示全部楼层
很有用,收藏了!

1

主题

25

帖子

12

安币

初级码农

Rank: 1

发表于 2011-9-13 13:25:34 | 显示全部楼层
好。。{:soso_e183:}

0

主题

21

帖子

0

安币

初级码农

Rank: 1

发表于 2011-9-14 10:09:10 | 显示全部楼层
谢谢楼主分享

0

主题

28

帖子

70

安币

程序猿

Rank: 2

发表于 2011-9-16 09:03:36 | 显示全部楼层
我是来下载学习的

主题

帖子

安币

游客

发表于 2011-9-17 10:21:09 | 显示全部楼层
图片挂了!````有点影响美观呵呵``
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )