在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。

下面通过一个实例来学习稍复杂一点listview的使用,在listview的每一个项中都有一个图片一个两个文字控件。为此需要:

1.一个activty来显示listview

2.一个Javabean,来为数据承载不同类型的数据

3.一个adapter来连接数据和listview

4.一个布局文件来设置listview的每一项的显示形式

 

第一步,新建一个Android项目。

在主界面的布局文件中加入一个listview控件并设置其属性。


<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@id/my_listv">
        
</ListView>
 
 
在activity文件中声明并初始化listview。
m_listv = (ListView) findViewById(R.id.my_listv);
第二步,新建一个JavaBean文件来承载我们需要显示的数据,其中文字为String类型,图片在Android中的存储方式为Int型的ID。Java文件的构造函数如下:
public MyDate(String name,String address,integer img){
      this.name = name;
      this.address = address;
      this.img = img;
   }
第三步,新建一个Layout文件来显示listview中的每一项的具体内容
这里因为有一个图片两个文字形式的内容,所以需要在布局中加入相应的控件。
第四步新建一个Adapter文件来连接数据和控件。
/*
 *adapter需要继承BaseAdater,继承这一接口需要实现一些函数。
 * 这些函数在listview的点击事件触发的时候会被调用。
 * 具体功能参见Android的开发文档 
 * 
 * */
还有一些注意的都在注释里。看注释即可
第五部,在Activity里为listView设置适配器。
MyAdapter adapter = new MyAdapter(this);
m_listv.setAdapter(adapter);
 
主要程序代码
packagecom.example.listviewdemo;

importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.widget.ListView;

public classMainActivity extends Activity {

         private ListView m_listv;

         @Override
         protected void onCreate(BundlesavedInstanceState) {
                   super.onCreate(savedInstanceState);
                   setContentView(R.layout.activity_main);

                   //初始化listview
                   m_listv = (ListView)findViewById(R.id.my_listv);

                   MyAdapter adapter = newMyAdapter(this);
                   //System.out.println("????????????????????????????????????????????????????????");
                   m_listv.setAdapter(adapter);
                   System.out.println("-------------------------------------------");
         }
}




package com.example.listviewdemo;
 
import android.R.integer;
 
public  classMyDate {
   
   private String name;
   private String address;
   private  int img;
   
   
//自动生成set和get函数
   public String getName() {
      return  name;
   }
   public  void setName(String name) {
      this.name = name;
   }
   public String getAddress() {
      return  address;
   }
   public  void setAddress(String address) {
      this.address = address;
   }
   public  int getImg() {
      return  img;
   }
   public  void setImg(int img) {
      this.img = img;
   }
   
   
//构造函数
   public MyDate(String name, String address, int  img) {
      this.name = name;
      this.address = address;
      this.img = img;
      System.out.println(">>>>>>>>>>>>inthe adpater-----------");
   }
   
 
}



packagecom.example.listviewdemo;

importjava.sql.Date;
importandroid.R.integer;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.TextView;
/*
 * adapter需要继承BaseAdater,继承这一接口需要实现一些函数。
 * 这些函数在listview的点击事件触发的时候会被调用。
 * 具体功能参见Android的开发文档
 * 
 * */
public classMyAdapter extends BaseAdapter{

    private Context m_context=null;

         //构造函数,用来显示在activity里新建实例
         public MyAdapter(Context context) {
                   // TODO Auto-generatedconstructor stub
                   this.m_context= context;
         }
         public Context getContext() {
                   return m_context;
         }


         //数据配置,新建一个mydate 类型的数组,并填充数据。数据可以手动添加也可以从数据源库读出,这里手动添加数据

         private MyDate[] Date = new MyDate[] 
                            {
                            new MyDate("李华","西安市", R.drawable.pic1),
                            new MyDate("张明","西安市", R.drawable.pic2),
                            new MyDate("小白","西安市", R.drawable.pic4),
                            new MyDate("小黑","西安市", R.drawable.pic9),
                            new MyDate("小王","西安市", R.drawable.pic9),
                            new MyDate("小八","西安市", R.drawable.pic4),
                            };


         @Override
         public int getCount() {
                   // TODO Auto-generated methodstub
                   return Date.length;
         }

         @Override
         public Object getItem(int position) {
                   // TODO Auto-generated methodstub
                   return Date[position];
         }

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

         @Override
         public View getView(int position, ViewconvertView, ViewGroup parent) {
                   // TODO Auto-generated methodstub
                   //为了避免资源的浪费,可以先判定一下convertview是否存在,如果是空的就新建一个,如果不是就重用
                   LinearLayout ll = null;
                   if (convertView!=null) {
                            ll = (LinearLayout)convertView;
                   }else{
                            ll = (LinearLayout)LayoutInflater.from(getContext()).
                                               inflate(R.layout.listitem,null);
                   }
                   //System.out.println(">>>>>>>>>>>>inthe adpater-----------");
          //获取数据
                   MyDate md = (MyDate)getItem(position);
                   //得到数据里面的内容
                   int m_img = md.getImg();
                   String m_name = md.getName();
                   String m_address =md.getAddress();
                   //得到listitem里面的控件
                   ImageView iv = (ImageView)ll.findViewById(R.id.imageView1);
                   TextView name = (TextView)ll.findViewById(R.id.name);
                   TextView address = (TextView)ll.findViewById(R.id.address);
                   //填充数据
                   iv.setImageResource(m_img);
                   name.setText(m_name);
                   address.setText(m_address);
                   System.out.println(">>>>>>>>>>>>inthe adpater-----------");

                   return null;
         }

}