android listview

一、不使用xml布局文件创建一个ListView

  1. 创建一个名称为HelloListView的Android工程,可以参见Android教程之三:第一个Android应用,HelloWorld
  2. 要使用ListView,需要让你的Activity继承于ListActivity,这个和以前的有区别,以前的都是继承Activity,该ListActivity继承Activity,扩展了很多常用的用于操作ListView的方法,使用很方便。
  3. 现修改HelloListView类如下:
    Java代码   收藏代码
    1. public class HelloListView extends ListActivity {  
    2.     /** Called when the activity is first created. */  
    3.     @Override  
    4.     public void onCreate(Bundle savedInstanceState) {  
    5.         super.onCreate(savedInstanceState);  
    6.         //setContentView(R.layout.main);  
    7.         //设置一个Adapter  
    8.         setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,COUNTRIES));  
    9.     }  
    10.     //数据数据  
    11.     private  static final String[] COUNTRIES=new String[]{"中国","俄罗斯","英国","法国"};  
    12. }  
  4. 运行程序效果如下:

     看到了吧,我们的数据已经通过列表的形式显示了出来!!!

    这里主要的是使用了一个Adapter—适配器,你可以把他看成是ListView的数据源,ListView要展示的数据都是已Adapter的形势传递给ListView的。这个Adapter很重要,Android的用于传给集合控件(ListView,Spinner,GridView等)的数据都是以Adapter的形势,这样的好处就是只要掌握了Adapter,就可以很随意的给这些集合控制传递数据,因为他们使用的都是Adapter。适配器适配器关键就是适配,只需公布一个Adapter,就全搞定了。Android已经给我们实现了一些常用的适配器,如刚刚使用的数组适配器,还有简单适配器等,如果这些不能满足,我们还可以通过自定义适配器来实现自己的适配器。其实一种适配器就对应了一个集合控件中的一个元素的布局展示。

二:使用xml来自定义ListView

  1. 上个例子我们并没有使用在main.xml中定义一个ListView的形势来布局ListView,而是使用的ListActivity中默认的ListView来演示的。
  2. 下面就使用我们在main.xml中自定义的ListView,这样我们可以很方便的控制ListView展示的布局,大小,背景色等属性。当然上个例子中我们一样可以通过getListView获取ListView后使用它的方法来改变布局、大小和背景色等。
  3. 修改main.xml为:
    Xml代码   收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <ListView xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:id="@android:id/list"  
    4.     android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent"  
    6.     android:background="#FF0000FF"  
    7.     >  
    8. </ListView>  
     这里要注意的是我们设置ListView的id为”@android:id/list”,意思是我们引用Android已经为我们定义好的一个id,名字是list,如果你不定义成这样,这个ListView是不能被ListActivity识别的。然后就是添加了一个蓝色的背景,看看我们这个自定义的ListView是否起了作用。
  4. 修改HelloListView类为:
    Java代码   收藏代码
    1. public class HelloListView extends ListActivity {  
    2.     /** Called when the activity is first created. */  
    3.     @Override  
    4.     public void onCreate(Bundle savedInstanceState) {  
    5.         super.onCreate(savedInstanceState);  
    6.         setContentView(R.layout.main);  
    7.         //设置一个Adapter  
    8.         setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,COUNTRIES));  
    9.     }  
    10.     //数据数据  
    11.     private  static final String[] COUNTRIES=new String[]{"中国","俄罗斯","英国","法国"};  
    12. }  
     比上个例子只是多了setContentView(R.layout.main);是为了让Android识别我们定义的ListView。
  5. 运行效果图:

     背景已经变成了蓝色,说明我们在xml中定义的ListView起作用了。

三:自定义要展示的元素

  1. 前面的两个例子都是展示一行文字,如果我们想图文混排怎么做呢,比如前面是文字,后面是图片。要实现这种功能就需要我们自定义Adapter啦。
  2. 新建布局文件item.xml,内容如下:
    Xml代码   收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout  
    3.   xmlns:android="http://schemas.android.com/apk/res/android"  
    4.   android:layout_width="fill_parent"  
    5.   android:layout_height="wrap_content">  
    6.   <TextView    
    7.     android:id="@+id/text"  
    8.     android:layout_alignParentLeft="true"  
    9.     android:layout_width="wrap_content"  
    10.     android:layout_height="wrap_content"/>  
    11.   <ImageView   
    12.     android:id="@+id/image"  
    13.     android:layout_alignParentRight="true"  
    14.     android:layout_width="wrap_content"  
    15.     android:layout_height="wrap_content"/>  
    16. </RelativeLayout>  

    这里主要定义一个TextView和一个ImageView,用于显示列表每一行的文本和图片

  3. 修改HelloListView类如下:
    Java代码   收藏代码
    1. public class HelloListView extends ListActivity {  
    2.     /** Called when the activity is first created. */  
    3.     @Override  
    4.     public void onCreate(Bundle savedInstanceState) {  
    5.         super.onCreate(savedInstanceState);  
    6.         setContentView(R.layout.main);  
    7.         //设置一个Adapter,使用自定义的Adapter  
    8.         setListAdapter(new TextImageAdapter(this));  
    9.     }  
    10.     /** 
    11.      * 自定义视图 
    12.      * @author 飞雪无情 
    13.      * 
    14.      */  
    15.     private class TextImageAdapter extends BaseAdapter{  
    16.         private Context mContext;  
    17.         public TextImageAdapter(Context context) {  
    18.             this.mContext=context;  
    19.         }  
    20.         /** 
    21.          * 元素的个数 
    22.          */  
    23.         public int getCount() {  
    24.             return texts.length;  
    25.         }  
    26.   
    27.         public Object getItem(int position) {  
    28.             return null;  
    29.         }  
    30.   
    31.         public long getItemId(int position) {  
    32.             return 0;  
    33.         }  
    34.         //用以生成在ListView中展示的一个个元素View  
    35.         public View getView(int position, View convertView, ViewGroup parent) {  
    36.             //优化ListView  
    37.             if(convertView==null){  
    38.                 convertView=LayoutInflater.from(mContext).inflate(R.layout.item, null);  
    39.                 ItemViewCache viewCache=new ItemViewCache();  
    40.                 viewCache.mTextView=(TextView)convertView.findViewById(R.id.text);  
    41.                 viewCache.mImageView=(ImageView)convertView.findViewById(R.id.image);  
    42.                 convertView.setTag(viewCache);  
    43.             }  
    44.             ItemViewCache cache=(ItemViewCache)convertView.getTag();  
    45.             //设置文本和图片,然后返回这个View,用于ListView的Item的展示  
    46.             cache.mTextView.setText(texts[position]);  
    47.             cache.mImageView.setImageResource(images[position]);  
    48.             return convertView;  
    49.         }  
    50.     }  
    51.     //元素的缓冲类,用于优化ListView  
    52.     private static class ItemViewCache{  
    53.         public TextView mTextView;  
    54.         public ImageView mImageView;  
    55.     }  
    56.   //展示的文字  
    57.     private  String[] texts=new String[]{"天气","我团","背景"};  
    58.     //展示的图片  
    59.     private int[] images=new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3};  
    60. }  
    这里的主要地方是自定义了一个Adapter,我们只需要继承BaseAdapter即可,BaseAdapter已经实现了Adapter的大部分方法,我们继承后只需要实现部分的方法即可。必须实现的就是getCount和getView方法,前一个是返回ListView中有多少个元素,后一个是生成要展示的View。ListView在每添加一个View是就会调用Adapter的getView方法,所以我们有必要对这个方法做优化,例子中就做了部分的优化,一般面试的时候会被问到ListView优化,回答例子中的这些代码就差不多了。
  4. 运行,我们会看到效果如图:

     

四、ListView列表中的元素的单击事件响应

  1. 如果我们要想单击一个ListView的元素使其作出相应的响应怎么办呢?比如弹出什么,打开什么,展示什么等等,那么我们只需要实现单击事件的函数既可。

  2. 要实现ListView的单击事件有两种方法,一个是使用getListView().setOnClickListener(l);设置,这个和平时我们用的控件设置是一样的,不做介绍,下面介绍第二个,就是重写ListActivity的onListItemClick方法,其实这个的最后处理也是ListView的setOnClickListener进行监听调用的。

  3. 在HelloListView类中增加如下代码:

    Java代码   收藏代码
    1. @Override  
    2. protected void onListItemClick(ListView l, View v, int position, long id) {  
    3.         Toast.makeText(this, "你单击了"+texts[position], Toast.LENGTH_SHORT).show();  
  4. 运行单击其中的一行效果如下图:

五、小结

到这里ListView应该算是会使用了,起码常用的功能会的,当然还有很多没有说到的,比如ListView的分割部分,headView和footView以及ListView的分页等等,这些就需要我们自己下去好好摸索了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值