1.简单介绍ListView

      listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。

getView方法详情

inflate(int, android.view.ViewGroup, boolean)
AdapterView
AdapterView
Adapter
Adapter
AdapterView
Adapter
AdapterView

          适配器支持的常见布局包括:

           

android ListView 展开 安卓listview的用法_android

    使用数据填充适配器视图

 AdapterView 实例与 Adapter 绑定来填充 AdapterView(如 ListView 或 GridView),此操作会从外部来源检索数据,并创建表示每个数据条目的 View

Android 提供了几个 Adapter 子类,用于检索不同种类的数据和构建 AdapterView 的视图。 两种最常见的适配器是:ArrayAdapter和SimpleCursorAdapter。

             

2.ListView使用步骤

     1).在布局的XML文件中,添加如下代码:

           



<ListView
      android:id="@+id/list_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />



   

     2)新建list_item的布局文件,确定每一个View的样式。

                

  3).新建一个适配器类。

 

     4).绑定数据到视图。

 

3.使用实例

     1).使用ArrayAdapter

           主layout文件:



mylistview.xml文件


<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ListView 
        android:id="@+id/mylistview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    </ListView>
</LinearLayout>



          list_item的xml文件:



list_item.xml文件


<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="18sp"
      >
</TextView>



         activity文件:

        



MyActivity.java文件


public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      String[] str = {"上海","北京","天津","江苏","河南","西藏","新疆","湖南","湖北"};
      List<String> listdata = new ArrayList<String>();
      listdata.add("上海");
      listdata.add("北京");
      listdata.add("天津");
      listdata.add("江苏");
      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item,listdata);//listdata和str均可
      listview.setAdapter(arrayAdapter);
    }
    
    
}



 

       2.使用SimpleAdapter

         构造方法:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

         simpleAdapter可以通过hashmap的方式,每个view可以显示几种不同的内容。

        1).主layout文件和上面相同

        2).list_item的布局文件

             



<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent"
        android:layout_height="match_parent"
    >
 <ImageView 
     android:id="@+id/iv1"
     android:layout_width="30dp"
     android:layout_height="30dp"
     android:src="@drawable/ic_launcher"    
     />
<TextView 
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="wgj"
        android:layout_toRightOf="@id/iv1"
      >
</TextView>
<TextView
     android:id="@+id/tv2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="18sp"
     android:text="19岁"
     android:layout_below="@id/tv1"
     android:layout_toRightOf="@id/iv1"
    >
</TextView>
</RelativeLayout>



      3.activity文件

         



public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      SimpleAdapter simpleAdapter = new SimpleAdapter(this,putData(),R.layout.list_item,
              new String[]{"name","age","pic"},new int[]{R.id.tv1,R.id.tv2,R.id.iv1});
      listview.setAdapter(simpleAdapter);
    }
    
    public List<Map<String,Object>> putData(){
        
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name", "张三");
        map1.put("age", "19岁");
        map1.put("pic", R.drawable.friend);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name", "李四");
        map2.put("age", "17岁");
        map2.put("pic", R.drawable.ic_launcher);
        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("name", "王五");
        map3.put("age", "17岁");
        map3.put("pic", R.drawable.ic_launcher);
        list.add(map1);
        list.add(map2);
        list.add(map3);
        return list;
    }  
}



   3.使用BaseAdapter

        优化方法 convertView 重用对象

          3.1.通过缓存convertView实现 
              - 这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能

          3.2.通过convertView+ViewHolder来实现 
                -ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。 
                -代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

         

         3.3Adapter文件



public class MyAdapter extends BaseAdapter{

    private LayoutInflater mInflater;
    private List<Map<String,Object>> list;
    
    
    public MyAdapter(Context context , List<Map<String,Object>> list){
        
        this.mInflater = LayoutInflater.from(context);
        this.list = list;
    }
    
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        
        ViewHolder holder = null;
        
        if (convertView == null) {
          
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder.name = (TextView)convertView.findViewById(R.id.tv1);
            holder.age = (TextView)convertView.findViewById(R.id.tv2);
            holder.pic = (ImageView)convertView.findViewById(R.id.iv1);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder)convertView.getTag();
        }
        
        holder.name.setText((String)list.get(position).get("name"));
        holder.age.setText((String)list.get(position).get("age"));
        holder.pic.setBackgroundResource((Integer)list.get(position).get("pic"));
        
        return convertView;
    }
    
    
    public final class ViewHolder{
        
        public TextView name;
        public TextView age;
        public ImageView pic;
    }

}



    3.4  Activity文件

        



public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      MyAdapter myAdapter = new MyAdapter(this,putData());
      listview.setAdapter(myAdapter);
    }
    
    public List<Map<String,Object>> putData(){
        
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name", "张三");
        map1.put("age", "19岁");
        map1.put("pic", R.drawable.friend);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name", "李四");
        map2.put("age", "17岁");
        map2.put("pic", R.drawable.ic_launcher);
        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("name", "王五");
        map3.put("age", "17岁");
        map3.put("pic", R.drawable.ic_launcher);
        list.add(map1);
        list.add(map2);
        list.add(map3);
        return list;
    }  
}