在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;
}
}