你的位置:首页 > 操作系统

[操作系统]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 

    

1 <ListView ="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 <??>2 <TextView ="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   @Override10   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 ="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 <??> 2 <LinearLayout ="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   <LinearLayout15     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     <TextView22       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     <TextView28       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   @Override15   protected void onCreate(Bundle savedInstanceState) {16     super.onCreate(savedInstanceState);17     setContentView(R.layout.activity_adapter);18     // 初始化控件ListView19     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 子样式 里面控件的id36     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

1 <ListView ="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 <??> 2 <LinearLayout ="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   <LinearLayout15     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     <TextView22       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     <TextView28       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   @Override19   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     @Override43     public int getCount() {44       return list.size();45     }46     //返回指定下标对应的数据对象47     @Override48     public Object getItem(int position) {49       return list.get(position);50     }51 52     @Override53     public long getItemId(int position) {54       // TODO Auto-generated method stub55       return 0;56     }57     /**58      * 59      * 返回指定下标对应的item的view对象60      * position:下标61      * convertview:可重复利用的控件62      * parent:ListView对象63      * */64     @Override65     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 实现里面的抽象方法