代码改变世界

ListView学习笔记

2011-03-25 14:31  shy.ang  阅读(1212)  评论(2编辑  收藏  举报

  对于ListView,有几种实现方式:

    @ extends Activity {

        setContentView(R.layout.xx);

        ListView listview = (ListView listview)findViewById(...);

        listview.setAdapter(adapter);

    @ extends Activity {

        ListView listview = new ListView(this);

        listview.setAdapter(adapter);

        this.setContentView(listview);//表示将listview直接显示而不是通过xml描述

    @ extends ListActivity {

        setListAdapter(adapter);

  对于第三种继承ListActivity的类setListAdapter会自动加载一个listview布局填充屏幕。你也可以通过setContentView(自己的layout)定制自己的屏幕布局,需要注意的是,你的视图必须包含一个id为"@android:id/list"(如果在代码中就是list)的ListView对象,即<ListView android:id = "@id/android:list"  ....../>。你自己设定的视图还可以在这个list视图是空的时候包含另一个可以显示任何类型对象的视图,而这个空列表必须有一个id为“android:empty”。如果一个list视图为空时,当没有数据显示时,它会被隐藏。

  ListAdapter 继承于Adapter,是ListView和其里面数据的适配器,是data和ListView的桥梁,起一个适配的作用。

  你也可以通过ListAdapter对象中的布局资源定义列表中每一行的布局,而一个ListAdapter构造的时候有参数来定义每一行的布局资源,也有两个额外的参数让你定义数据域和list行布局资源中对象的对应关系,这两个参数通常是parallel arrays。Android也提供标准的行布局,android.R.layout.simple_list_item_1,

simple_list_item_2,two_line_list_item等。

  通过实现ListAdapter接口的适配器类来绑定ListView和数据,Android提供两个标准list adapters:用于静态数据的SimpleAdapter和用于Cursor查询结果的SimpleCursorAdapter。

  BaseAdapter 继承ListAdapterSpinnerAdapter,是基础的ListView、Spinner和数据的适配器。

  

setListAdapter(new ImageAdapter());//调用

//扩展BaseAdapter,还是比较简单,连构造函数也不用
public class ImageAdapter extends BaseAdapter {
//......
@override
public View getView(){
......
}
}

    ArrayAdapterListAdapter的直接子类,是数组和ListView的桥梁,将数组内定义的数据一一对应的显示在ListView中。由Arrayadapter进行适配的ListView每一项通常默认只有一个TextView,而TextView里显示的内容就是数组中的对象调用toString()方法后生成的字符串。

  然而TextView是可以参考的,它会被数组中每一个对象toString()后的值填充,你可以增加定制对象的数组或者列表。重写toString()方法来决定什么内容会被显示在列表项中。

  简单的构造方法:new ArrayAdapter<T>(context,TextView布局,插入listview的数组T[]Objects(或者列表List<T>Objects));

   如果你想用更复杂的布局,可以使用带域id的构造函数,这个域id应该在更大的布局资源中引用一个TextView。

  如果不是用TextViews来显示数组,例如ImageViews,或者除toString之外还有数据要显示,重写getView来确定你想要的视图类型。

  复杂构造方法:

      new ArrayAdapter<T>( context,Item布局,Item中TextView布局,T[]Objects(或者列表List<T>Objects));其中数组类型没有限制,可以为任何对象,T是数组类型。

  还有其他的方法。

  Android项目中自己定义的布局方式可以通过R.layout.xx访问,而系统也提供了很多默认布局方式,通过android.R.layout.xx来访问

   对于ListView中某一项的布局方式,系统提供有:

      Android.R.layout.simple_list_item_1:每一项只有一个TextView

      Android.R.layout.simple_list_item_2:每一项有两个TextView

    Android.R.layout.simple_list_item_single_choice:每一项只有一个TextView,但这一项可以被选择


  对于BaseAdapter和ArrayAdapter,ArrayAdapter是从BaseAdapter派生出来的,具备BaseAdapter的所有功能,但ArrayAdapter更为强大,它实例化时可以直接使用泛型构造。当item数量较多,比如超过100条或频繁动态增减时使用arrayadapter可以方便控制ui,通过setNotifyOnChanage方法。如果比较简单仅仅呈现直接从 baseadapter更节省资源。


      SimpleAdapter是ListAdapter的直接子类,通过它可以让ListView中的每一项里面的内容更加人性化。通常将ListView中某项的布局信息写在一个XML布局文件中,可通过R.layout.xx获得。

  SimpleAdapter可以将静态数据和定义在xml中的视图进行匹配。你可以定义在列表中显示的ArrayList of Maps类型的数据。每一个ArrayList入口相当于列表的一行。而Maps包含每一行的数据。绑定数据到视图有两步:首先,会用到SimpleAdapter.ViewBinder,调用setViewValue(android.view.View,Object,String),如果返回true,则绑定成功;否则会有下面的视图按顺序尝试再绑定:复选框视图,TextView(调用setViewText(TextView,String),ImageView(调用setViewImage(ImageView,int/String),如果还返回false,就抛出异常。

      ArrayAdapter是数组和ListView的桥梁,而SimpleAdapter是ArrayAdapter和ListView的桥梁。需要注意的是这个ArrayList中每一项都是一个Map<String,?>类型ArrayList中的每一项Map对象都和ListView当中的一项进行数据绑定和一一对应。

  Public SimpleAdapter(Context context,List<? extends Map<String, Object>> data,int resource, String[] from , int[] to)

    data,基于Map的List,里边每一项都和ListView中每一项对应。data里每一项都是Map类型,这个Map类包含了ListView每一行需要的数据。比较常用的方法是:data = new ArrayList <Map<String, Object>>();

    resource就是一个layout,最起码要包含在to中出现的那些视图,一般用系统提供的就可以,如:                                           Android.R.layout.simple_list_item_single_choice和Android.R.layout.two_line_list_item等。

    from 为了在ArrayList中的每一个item中索引Map<String,Object>的Object用的

    to 显示from列的视图,一般是一个Textview数组,以id的形式表示,如Android.R.id.text1。