Android ListView初步

   一、基本概念

ListView相信大家一定不陌生,用了安卓手机也有一些时间了,我发现几乎所有的应用都用到了ListView,所以可见ListView是多么重要的一个组件。但是,感觉自己对它的掌握和理解还是差很多,于是根据开发经验以及网上的资料来写一篇文章整理对ListView的理解。

ListView

extends AbsListView

java.lang.Object
android.view.View
  android.view.ViewGroup
    android.widget.AdapterView<T extends android.widget.Adapter>
      android.widget.AbsListView
        android.widget.ListView
Known Direct Subclasses

ListView是一个显示一个垂直滚动列表中项目的视图,项目来自与此视图相关的ListAdapter。

 

 

XML属性:

(4)android:divider 各个项目之间的分隔符,可以用Drawable 或者 color 来表示。

(2)

(3)

还用一个比较重要的方法就是SetAdapter()。当我们实例化一个ListView,然后就调用SetAdapter()方法来进行数据的绑定。其中Adapter一般有以下几种:ArrayAdapter,SimpleAdapter和SimpleCursorAdapter以及BaseAdapter。ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。

 

二、实例

①用ListView来显示文本,点击文本进入另一个Activity。

我们用两种方法来实现,一个是用xml属性里的entries,另一个是ArrayAdapter。先用第一种方法,在values文件夹里面新建arrays.xml:

 1 <SPAN style="FONT-SIZE: 14px"><?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3 
 4     <string-array name="listtext">
 5         <item>安卓</item>
 6         <item>苹果</item>
 7         <item>WindowsPhone</item>
 8     </string-array>
 9 
10 </resources></SPAN>

 main.xml中添加ListView组件,如下: 

 1 <SPAN style="FONT-SIZE: 14px"><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     tools:context=".ListViewDemo" >
 6 
 7     <ListView
 8         android:id="@+id/listview"
 9         android:layout_width="match_parent"
10         android:entries="@array/listtext"//用来在ListView显示的文本
11         android:layout_height="match_parent" >
12     </ListView>
13 
14 </RelativeLayout></SPAN>

MainActivity.javaa如下:

 1 <SPAN style="FONT-SIZE: 14px">package com.example.listviewdemo;
 2 import java.util.ArrayList;
 3 import java.util.HashMap;
 4 import java.util.List;
 5 import java.util.Map;
 6 import android.os.Bundle;
 7 import android.app.Activity;
 8 import android.content.Intent;
 9 import android.database.DataSetObserver;
10 import android.view.Menu;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.AdapterView;
14 import android.widget.AdapterView.OnItemClickListener;
15 import android.widget.ArrayAdapter;
16 import android.widget.ListAdapter;
17 import android.widget.ListView;
18 import android.widget.SimpleAdapter;
19 
20 public class ListViewDemo extends Activity {
21 
22     private ListView listView;
23     private Intent intent;
24     @Override
25     protected void onCreate(Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27         setContentView(R.layout.activity_list_view_demo);
28         listView=(ListView) findViewById(R.id.listview);    
29         listView.setOnItemClickListener(new OnItemClickListener() {
30             @Override
31             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
32                     long arg3) {
33                 switch(arg2){
34                 case 0:
35                     intent=new Intent(ListViewDemo.this,OtherActivity.class);
36                     startActivity(intent);
37                     break;
38                 case 1:
39                     intent=new Intent(ListViewDemo.this,OtherActivity.class);
40                     startActivity(intent);
41                     
42                 case 2:
43                     intent=new Intent(ListViewDemo.this,OtherActivity.class);
44                     startActivity(intent);
45                 }
46                 
47             }
48             
49         });
50     }    
51     @Override
52     public boolean onCreateOptionsMenu(Menu menu) {
53         // Inflate the menu; this adds items to the action bar if it is present.
54         getMenuInflater().inflate(R.menu.activity_list_view_demo, menu);
55         return true;
56     }
57 
58 
59 }</SPAN>

另一种方式就是ArrayAdapter:

<SPAN style="FONT-SIZE: 14px">public class ListViewDemo  extends Activity {
 
    private ListView listView;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view_demo);
        listView=(ListView) findViewById(R.id.listview);
 listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData())); setContentView(listView); } private List<String> getData(){ List<String> data = new ArrayList<String>(); data.add("苹果"); data.add("安卓"); data.add("windowsphone"); return data; 
}}</SPAN>

效果如下:

 

还有可以用SimpleAdapter和SimpleCursorAdapter往列表中添加图片等其他组件。simpleAdapter的扩展性最好,可以定 义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。 SimpleCursorAdapter比SimpleAdapter多了一个可以从数据库查询数据并显示在ListView中。 当然,我们最常用的还是BaseAdapter,可以根据需求来写我们自己的Adapter。下面这个例子就用到了BaseAdapter。 用过安卓的用户都知道,像软件市场,微信对话里面都用到了ListView。比如软件Marcket里面基本上就是一个ListView,每一个item有一个软件,如图:

之前我们在ListView的item里面只是显示文本,这种情况比较适合在设置界面,那Marcket的item是如何实现的呢。无非也就是在item里面显示图片,文本以及按钮。

下面模仿这个效果做一下:

xml文件:

 1 <SPAN style="FONT-SIZE: 14px"><?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     <LinearLayout
 7         android:id="@+id/linear1"
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:layout_alignParentLeft="true"
11         android:layout_marginLeft="10dp"
12          >
13 
14         <ImageView
15             android:id="@+id/appimg"
16             android:layout_width="40dp"
17             android:layout_height="40dp"
18              />
19     </LinearLayout>
20 
21     <LinearLayout
22         android:id="@+id/linear2"
23         android:layout_width="wrap_content"
24         android:layout_height="wrap_content"
25         android:layout_alignBottom="@+id/linear1"
26         android:layout_alignParentTop="true"
27         android:layout_marginLeft="5dp"
28         android:layout_toRightOf="@id/linear1"
29         android:orientation="vertical" >
30 
31         <LinearLayout
32             android:id="@+id/sublinear1"
33             android:layout_width="wrap_content"
34             android:layout_height="wrap_content" >
35 
36             <TextView
37                 android:id="@+id/appnametext"
38                 android:layout_width="wrap_content"
39                 android:layout_height="wrap_content" 
40                 android:text="@string/weixin"
41                 />
42         </LinearLayout>
43 
44         <LinearLayout
45             android:id="@+id/sublinear2"
46             android:layout_marginTop="5dp"
47             android:layout_width="wrap_content"
48             android:layout_height="wrap_content"
49             android:orientation="horizontal"
50              >
51 
52             <TextView
53                 android:id="@+id/sizetext"
54                 android:layout_width="wrap_content"
55                 android:layout_height="wrap_content"
56                 android:text="@string/weixinsize"
57                  />
58 
59             <ImageView 
60                 android:id="@+id/slashimg"
61                 android:layout_width="wrap_content"
62                 android:layout_height="wrap_content"
63                 android:layout_marginLeft="3dp"
64                 android:layout_marginRight="3dp"
65                 android:src="@drawable/slash"
66                 />
67             <TextView
68                 android:id="@+id/amounttext"
69                 android:layout_width="wrap_content"
70                 android:layout_height="wrap_content" 
71                 android:text="@string/downamount"
72                 />
73         </LinearLayout>
74     </LinearLayout>
75 
76     <LinearLayout
77         android:id="@+id/linear3"
78         android:layout_width="wrap_content"
79         android:layout_height="wrap_content"
80         android:layout_alignParentRight="true"
81         android:layout_marginRight="10dp"
82          >
83 
84         <Button
85             android:id="@+id/dowmbutton"
86             android:layout_width="wrap_content"
87             android:layout_height="35dp"
88             android:layout_marginTop="5dp"
89             android:text="@string/downapp" />
90 
91     </LinearLayout>
92 
93 </RelativeLayout></SPAN>

Activity代码如下:

  1 <SPAN style="FONT-SIZE: 14px">package com.example.listviewdemo;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7 import android.os.Bundle;
  8 import android.app.Activity;
  9 import android.content.Context;
 10 import android.content.Intent;
 11 import android.database.DataSetObserver;
 12 import android.view.LayoutInflater;
 13 import android.view.Menu;
 14 import android.view.View;
 15 import android.view.ViewGroup;
 16 import android.widget.AdapterView;
 17 import android.widget.AdapterView.OnItemClickListener;
 18 import android.widget.ArrayAdapter;
 19 import android.widget.BaseAdapter;
 20 import android.widget.Button;
 21 import android.widget.ImageView;
 22 import android.widget.ListAdapter;
 23 import android.widget.ListView;
 24 import android.widget.SimpleAdapter;
 25 import android.widget.TextView;
 26 
 27 public class ListViewDemo extends Activity {
 28 
 29     private ListView listView;
 30     private Intent intent;
 31     private List<Map<String, Object>> mData;
 32 
 33     @Override
 34     protected void onCreate(Bundle savedInstanceState) {
 35         super.onCreate(savedInstanceState);
 36         setContentView(R.layout.activity_list_view_demo);
 37         listView = (ListView) findViewById(R.id.listview);    
 38         SimpleAdapter simpleAdapter = new SimpleAdapter(this, getData(),
 39                 R.layout.item, new String[] { "nametext", "teitext",
 40                         "amounttext" }, new int[] { R.id.name_text,
 41                         R.id.tel_text, R.id.image });
 42         listView.setAdapter(simpleAdapter);
 43         mData = getData();
 44             MyAdapter adapter = new MyAdapter(this);
 45             listView.setAdapter(adapter);
 46     }
 47 
 48     public List<Map<String, Object>> getData() {
 49         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
 50         Map<String, Object> map = new HashMap<String, Object>();
 51         
 52         map.put("appnametext", "微信");
 53         map.put("sizetext", "15.2");
 54         map.put("amounttext", "1234323");
 55         map.put("appimg", R.drawable.weixin);
 56         list.add(map);
 57         
 58         map = new HashMap<String, Object>();
 59         map.put("appnametext", "手机QQ");
 60         map.put("sizetext", "8.5");
 61         map.put("amounttext", "122073323");
 62         map.put("appimg", R.drawable.qq);
 63         list.add(map);
 64         
 65         map = new HashMap<String, Object>();
 66         map.put("appnametext", "手机QQ空间");
 67         map.put("sizetext", "6.3");
 68         map.put("amounttext", "122393");
 69         map.put("appimg", R.drawable.qqko);
 70         list.add(map);
 71         
 72         map = new HashMap<String, Object>();
 73         map.put("appnametext", "微博");
 74         map.put("sizetext", "7.7");
 75         map.put("amounttext", "1278323");
 76         map.put("appimg", R.drawable.weib);
 77         list.add(map);
 78         
 79         map = new HashMap<String, Object>();
 80         map.put("appnametext", "陌陌");
 81         map.put("sizetext", "6.9");
 82         map.put("amounttext", "1279073");
 83         map.put("appimg", R.drawable.mom);
 84         list.add(map);
 85         
 86         map = new HashMap<String, Object>();
 87         map.put("appnametext", "飞信");
 88         map.put("sizetext", "6.9");
 89         map.put("amounttext", "1279073");
 90         map.put("appimg", R.drawable.fei);
 91         list.add(map);
 92         return list;
 93     }
 94 
 95     public final class ViewHolder {
 96         public ImageView appimg;
 97         public TextView appnametext;
 98         public TextView sizetext;
 99         public TextView amounttext;
100         public Button dowmbutton;
101     }
102 
103     public class MyAdapter extends BaseAdapter {
104 
105         private LayoutInflater mInflater;
106 
107         public MyAdapter(Context context) {
108             this.mInflater = LayoutInflater.from(context);
109         }
110 
111         @Override
112         public int getCount() {
113             return mData.size();
114         }
115 
116         @Override
117         public Object getItem(int arg0) {
118             return null;
119         }
120 
121         @Override
122         public long getItemId(int arg0) {
123             return 0;
124         }
125 
126         @Override
127         public View getView(int arg0, View arg1, ViewGroup arg2) {
128             ViewHolder holder = null;
129             if (arg1 == null) {
130 
131                 holder = new ViewHolder();
132 
133                 arg1 = mInflater.inflate(R.layout.item1, null);
134                 holder.appimg = (ImageView) arg1.findViewById(R.id.appimg);
135                 holder.appnametext = (TextView) arg1.findViewById(R.id.appnametext);
136                 holder.sizetext = (TextView) arg1.findViewById(R.id.sizetext);
137                 holder.amounttext = (TextView) arg1.findViewById(R.id.amounttext);
138                 holder.dowmbutton = (Button) arg1.findViewById(R.id.dowmbutton);
139                 
140                 arg1.setTag(holder);
141             } else {
142                 holder = (ViewHolder) arg1.getTag();
143             }
144             
145             holder.appimg.setBackgroundResource((Integer) mData.get(arg0).get("appimg"));
146             holder.appnametext.setText((String) mData.get(arg0).get("appnametext"));
147             holder.sizetext.setText((String) mData.get(arg0).get("sizetext"));
148             holder.amounttext.setText((String) mData.get(arg0).get("amounttext"));
149             
150             return arg1;
151         }
152 
153     }
154 }</SPAN>

 效果如下:

 

虽然效果达到了,但是我们这只是一个本地的显示,实际应用中都是从网络上下载然后展示的。流程应该是从数据库中获取数据,然后封装成josn或xml,之后安卓端异步解析并且显示。关于ListView还有很多要说的东西,优化,分页加载,下拉刷新等等。

转:http://blog.csdn.net/wangjinyu501/article/details/8216336

posted on 2013-04-10 22:50  henry_xu  阅读(2113)  评论(1)    收藏  举报