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一次