Android UI ListView的使用
一、ListView的理解
1.什么ListView?
一种用来显示多个可滑动项(Item)列表的的ViewGroup
需要使用Adapter将集合数据和每一个Item所对应的布局动态适配到ListView中显示
显示列表: listView.setAdapter(adapter)
更新列表: adapter.notifyDataSetChanged()
二、实现ListView的三种常用方式
1、ArrayAdapter应用
ArrayAdapter(Context context,int resource,T[] objects)
ArrayAdapter(Context context,int resource,List<T> objects)
context:上下文对象,一般为Activity对象
resourcce:Item的布局文件标识
objects:需要显示的数据集合
2.案例
1.创建一个 layout xml文件
1 <ListView xmlns:android="http://schemas.android.com/apk/res/android" 2 android:id="@+id/listView1" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 > 6 7 </ListView>
2.创建 layout 文件 布局 ListView 子元素 items
1 <?xml version="1.0" encoding="utf-8"?> 2 <TextView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="50dp" 5 android:layout_marginLeft="20sp" 6 android:gravity="fill_vertical" 7 android:id="@+id/item_adapter" > 8 </TextView>
3. 代码实现
1 package com.example.android_ui_listview; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.ArrayAdapter; 6 import android.widget.ListView; 7 8 public class MainActivity extends Activity { 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_adapter); 13 14 // 初始化控件 15 ListView adapter_lv = (ListView) findViewById(R.id.listView1); 16 // 1.准备集合数据 17 String[] strs = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "09", 18 "89", "77", "55", "ut", "sd", "gj", "gjk", "qw", "jhk" }; 19 // 2.准备ArrayAdapter对象 20 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 21 R.layout.adapter_item, strs); 22 // 3.设置Adapter显示列表 23 adapter_lv.setAdapter(adapter); 24 } 25 }
效果:
2、SimpleAdapter应用
SimpleAdapter(Context context,List<? entends Map<String,?>> data,int resource,String[] from,int[] to)
context:上下文对象,一般为Activity对象
data:需要显示的数据集合
resource:Item布局文件的标识
from:Map对象的Key的数组,用于得到对应的value
to:Item布局文件中的子View的id的数组
1).创建 layout
1 <ListView xmlns:android="http://schemas.android.com/apk/res/android" 2 android:id="@+id/listView1" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 > 6 7 </ListView>
2). item 布局
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="horizontal" 6 android:id="@+id/simple_adapter"> 7 8 <ImageView 9 android:id="@+id/siple_iv" 10 android:layout_width="60dp" 11 android:layout_height="70dp" 12 android:src="@drawable/ic_launcher" /> 13 14 <LinearLayout 15 android:layout_width="wrap_content" 16 android:layout_height="69dp" 17 android:layout_marginRight="15dp" 18 android:gravity="center_vertical" 19 android:orientation="vertical"> 20 21 <TextView 22 android:id="@+id/siple_tv1" 23 android:layout_width="wrap_content" 24 android:layout_height="wrap_content" 25 android:text="@string/adapter_test" /> 26 27 <TextView 28 android:id="@+id/siple_tv2" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:text="@string/adapter_number" /> 32 </LinearLayout> 33 34 </LinearLayout>
3)代码实现
1 package com.example.android_ui_listview; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import android.app.Activity; 9 import android.os.Bundle; 10 import android.widget.ListView; 11 import android.widget.SimpleAdapter; 12 13 public class MainActivity extends Activity { 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_adapter); 18 // 初始化控件ListView 19 ListView listView = (ListView) findViewById(R.id.listView1) ; 20 21 //1.准备数据 22 List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ; 23 for(int i=0;i<10;i++){ 24 Map<String,Object> map = new HashMap<String,Object>() ; 25 // key对应的from数组 26 map.put("siple_iv", R.drawable.ic_launcher) ; 27 map.put("siple_tv1", "价格:"+(i*3+0.1)) ; 28 map.put("siple_tv2", i+100) ; 29 list.add(map) ; 30 } 31 32 //2.准备SimpleAdapter对象 33 // 准白 34 String[] from = { "siple_iv", "siple_tv1", "siple_tv2" }; 35 // 对应 Item 子样式 里面控件的id 36 int[] to = { R.id.siple_iv, R.id.siple_tv1,R.id.siple_tv2} ; 37 SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,R.layout.siple_adapter, from, to) ; 38 39 //3.添加到listView里面 40 listView.setAdapter(simpleAdapter) ; 41 } 42 }
4).
3、BaseAdapter(抽象类)应用
public view getView(int position,View converView,ViewGroup parent)
返回指定下标所对应的item的View对象
position:下标
converView:可复用的缓存Item视图对象,前n+1个为null
parent:ListView对象
1.layout xml配置
1 <ListView xmlns:android="http://schemas.android.com/apk/res/android" 2 android:id="@+id/listView1" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 > 6 7 </ListView>
2.ListView子元素 item 布局
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="horizontal" 6 android:id="@+id/simple_adapter"> 7 8 <ImageView 9 android:id="@+id/siple_iv" 10 android:layout_width="60dp" 11 android:layout_height="70dp" 12 android:src="@drawable/ic_launcher" /> 13 14 <LinearLayout 15 android:layout_width="wrap_content" 16 android:layout_height="69dp" 17 android:layout_marginRight="15dp" 18 android:gravity="center_vertical" 19 android:orientation="vertical"> 20 21 <TextView 22 android:id="@+id/siple_tv1" 23 android:layout_width="wrap_content" 24 android:layout_height="wrap_content" 25 android:text="@string/adapter_test" /> 26 27 <TextView 28 android:id="@+id/siple_tv2" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:text="@string/adapter_number" /> 32 </LinearLayout> 33 34 </LinearLayout>
3.创建一个简单实体类
1 package com.example.android_ui_listview; 2 3 public class ShopInfo { 4 private int image ; //图片 5 private String sname ; //名称 6 private String price ; //价格 7 8 public ShopInfo() { 9 super(); 10 } 11 public ShopInfo(int image, String sname, String price) { 12 super(); 13 this.image = image; 14 this.sname = sname; 15 this.price = price; 16 } 17 public int getImage() { 18 return image; 19 } 20 public void setImage(int image) { 21 this.image = image; 22 } 23 public String getSname() { 24 return sname; 25 } 26 public void setSname(String sname) { 27 this.sname = sname; 28 } 29 public String getPrice() { 30 return price; 31 } 32 public void setPrice(String price) { 33 this.price = price; 34 } 35 }
4.activity实现
1 package com.example.android_ui_listview; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.view.View; 9 import android.view.ViewGroup; 10 import android.widget.BaseAdapter; 11 import android.widget.ImageView; 12 import android.widget.ListView; 13 import android.widget.TextView; 14 15 16 public class MainActivity extends Activity { 17 List<ShopInfo> list ; 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_adapter); 22 23 // 初始化 ListView 24 ListView listView = (ListView) findViewById(R.id.listView1) ; 25 26 // 1.准备数据 27 list = new ArrayList<ShopInfo>() ; 28 for(int i=0;i<100;i++){ 29 ShopInfo s = new ShopInfo(R.drawable.ic_launcher,"名称:Android"+(i+1)+"号","价格:"+(i*12)+"$") ; 30 list.add(s) ; 31 } 32 33 // 2.准备BaseAdapter对象 34 MyBaseAdapter baseAdapter = new MyBaseAdapter() ; 35 36 // 3.添加listView里面 37 listView.setAdapter(baseAdapter) ; 38 } 39 40 class MyBaseAdapter extends BaseAdapter{ 41 // 返回集合数据的数量 42 @Override 43 public int getCount() { 44 return list.size(); 45 } 46 //返回指定下标对应的数据对象 47 @Override 48 public Object getItem(int position) { 49 return list.get(position); 50 } 51 52 @Override 53 public long getItemId(int position) { 54 // TODO Auto-generated method stub 55 return 0; 56 } 57 /** 58 * 59 * 返回指定下标对应的item的view对象 60 * position:下标 61 * convertview:可重复利用的控件 62 * parent:ListView对象 63 * */ 64 @Override 65 public View getView(int position, View convertView, ViewGroup parent) { 66 //加载item的布局,得到View对象 67 if(convertView == null){ //如果直接创建,很有可能照成应用崩毁 68 convertView = View.inflate(MainActivity.this, R.layout.siple_adapter, null) ; 69 } 70 //根据position设置对应的数据 71 //得到当前行的数据对象 72 ShopInfo s = list.get(position) ; 73 //得到子view对象 74 ImageView imageView = (ImageView) convertView.findViewById(R.id.siple_iv) ; 75 TextView tv1 = (TextView) convertView.findViewById(R.id.siple_tv1) ; 76 TextView tv2 = (TextView) convertView.findViewById(R.id.siple_tv2) ; 77 // 设置资源 78 imageView.setImageResource(s.getImage()) ; 79 tv1.setText(s.getSname()) ; 80 tv2.setText(s.getPrice()) ; 81 82 return convertView; 83 } 84 85 } 86 }
实现效果
总结: SimpleAdapter 和 BaseAdapter 很类似
SimpleAdapter是把数据存放在Map中,根据from 和to 对应的
BaseAdapter是把数据存放到自己定义的Pojo中 在根据继承BaseAdapter 实现里面的抽象方法