android控件学习之listview

listview用来展示列表数据

一、entries生成数据

1  <ListView 
2   android:layout_width="wrap_content"
3   android:layout_height="wrap_content"
4   android:entries="@array/books" 
5   android:footerDividersEnabled="false" 
6     />

arrays.xml的配置

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3     <string-array name="books">
4         <item>android</item>
5         <item>think in java</item>
6         <item>我的未来不是梦</item>
7     </string-array>
8 </resources>

效果显示

 

二、ArrayAdapter生成数据

布局xml的配置

1 <ListView android:id="@+id/list1"
2  android:layout_width="wrap_content"
3  android:layout_height="wrap_content" />

android中的代码

1 ListView listView = (ListView) findViewById(R.id.list1);
2         String teches[] = { "android", "java", "oracle" };
3         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
4                 android.R.layout.simple_list_item_1, teches);
5         listView.setAdapter(adapter);

这里需要注意的是arrayadapter的第二个参数,有多少选择,这里不做深入讨论

三、继承ListActivity生成数据

 1 public class ListView2 extends ListActivity{
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         // TODO Auto-generated method stub
 6         super.onCreate(savedInstanceState);
 7         
 8         String arrs[]={"aa","bb"};
 9         ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arrs);
10         setListAdapter(adapter);
11         
12         
13     }
14 }

这里需要注意的是无需指定一个布局xml

四、SimpleAdapter生成数据

xml布局

 

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent" android:layout_height="match_parent">
 3 
 4     <ImageView android:id="@+id/iamgeview1" android:layout_width="wrap_content" android:layout_weight="1"
 5         android:layout_height="wrap_content"></ImageView>
 6 
 7 <LinearLayout android:layout_width="wrap_content" android:layout_weight="1"
 8         android:layout_height="wrap_content" android:orientation="vertical">
 9         <TextView android:id="@+id/title" android:layout_width="wrap_content"
10         android:layout_height="wrap_content" android:textSize="18sp"></TextView>
11         
12         <TextView android:id="@+id/content" android:layout_width="wrap_content"
13         android:layout_height="wrap_content" android:textSize="14sp" android:gravity="bottom|center_vertical"></TextView>
14         
15         </LinearLayout>
16 
17 </LinearLayout>

android中的代码

 1 public class ListView3 extends ListActivity {
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         // TODO Auto-generated method stub
 6         super.onCreate(savedInstanceState);
 7 
 8         SimpleAdapter adapter = new SimpleAdapter(this, getData(),
 9                 R.layout.listview3, new String[] { "img", "title", "content" },
10                 new int[] { R.id.iamgeview1, R.id.title, R.id.content });
11         this.setListAdapter(adapter);
12 
13     }
14 
15     int images[] = new int[] { R.drawable.ferrari, R.drawable.lamborghini,
16             R.drawable.porsche };
17 
18     public List<Map<String, Object>> getData() {
19         List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();
20         for (int i = 0; i < images.length; i++) {
21             Map<String, Object> map = new HashMap<String, Object>();
22             map.put("img", images[i]);
23             map.put("title", "superCar" + i);
24             map.put("content", "superCar description" + i);
25             datas.add(map);
26         }
27         return datas;
28     }
29 
30 }

效果图

由于图片比较大,造成展示的效果不是很好,姑且先如此吧

五、自定义BaseAdapter生成数据

这里需要说明的是,实际开发中,自定义baseAdapter来完成需求是很常用的,同时也是listview真正需要掌握的地方

自定义好处在于可以灵活布局

假设现在我们有一个需求,那就是给list中的每条记录添加一个button控件,并且添加事件,用之前的方式就无法满足我们的需求

对比用SimpleAdapter的方式

效果图先上

布局xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent" android:layout_height="match_parent">
 3 
 4     <ImageView android:id="@+id/img" android:layout_width="wrap_content" 
 5         android:layout_height="wrap_content"></ImageView>
 6 
 7 <LinearLayout android:layout_width="wrap_content" 
 8         android:layout_height="wrap_content" android:orientation="vertical">
 9         <TextView android:id="@+id/head" android:layout_width="wrap_content"
10         android:layout_height="wrap_content" android:textSize="18sp"></TextView>
11         
12         <TextView android:id="@+id/info" android:layout_width="wrap_content"
13         android:layout_height="wrap_content" android:textSize="14sp" android:gravity="bottom|center_vertical"></TextView>
14         
15         </LinearLayout>
16         
17         <Button android:id="@+id/btn" android:layout_width="wrap_content" 
18         android:layout_height="wrap_content"></Button>
19 
20 </LinearLayout>
1     protected void onCreate(Bundle savedInstanceState) {
2         // TODO Auto-generated method stub
3         super.onCreate(savedInstanceState);
4         //datas = getData();
5         MyAdapter adapter=new MyAdapter(this);
6         setListAdapter(adapter);
7 
8     }
 1 /** 自定义适配器 */
 2     public  class MyAdapter extends BaseAdapter {
 3         private LayoutInflater mInflater;
 4 
 5         public MyAdapter(Context context) {
 6             this.mInflater = LayoutInflater.from(context);
 7 
 8         }
 9 
10         @Override
11         public int getCount() {
12             // TODO Auto-generated method stub
13             return datas.size();
14         }
15 
16         @Override
17         public Object getItem(int position) {
18             // TODO Auto-generated method stub
19             return position;
20         }
21 
22         @Override
23         public long getItemId(int position) {
24             // TODO Auto-generated method stub
25             return position;
26         }
27 
28         @Override
29         public View getView(int position, View convertView, ViewGroup parent) {
30             // TODO Auto-generated method stub
31             // convertView.setTag(tag)
32             ViewHolder holder = null;
33             if (null == convertView) {
34                 convertView = this.mInflater.inflate(R.layout.listview4, null);
35                 
36             ImageView img=        (ImageView)convertView.findViewById(R.id.img);
37             TextView info=(TextView)convertView.findViewById(R.id.info);
38             TextView head=(TextView)convertView.findViewById(R.id.head);
39             Button btn=(Button)convertView.findViewById(R.id.btn);
40             img.setBackgroundResource(R.drawable.icon);
41             info.setText("info"+position);
42             head.setText("head_"+position);
43             btn.setText("btn_"+position);
44             final int index=position;
45             btn.setOnClickListener(new OnClickListener() {
46             
47                 @Override
48                 public void onClick(View v) {
49                     new AlertDialog.Builder(ListView4.this).setTitle("title").setMessage("info"+index)
50                     .setPositiveButton("", new DialogInterface.OnClickListener() {
51                         
52                         @Override
53                         public void onClick(DialogInterface dialog, int which) {
54                             // TODO Auto-generated method stub
55                             
56                         }
57                     }).show();
58                     
59                 }
60             });
61             
62             return convertView;
63         }

考虑到多次展示问题,android为我们提供了缓存机制,避免每一次都去findviewid一次

 

 

 

posted @ 2012-10-30 15:45  draem0507  阅读(1166)  评论(0编辑  收藏  举报
View Code