假设ListView要加载一个People的对象,那么新建一个ListView的步骤如下
1.首先在主界面新建一个ListView
<ListView
android:id="@+id/lv_people"
android:layout_width="match_parent"
android:laout_height="wrap_content"
android:divider="#0000" />
ListView中用到了一个divider属性,它可以用来指定分割线的颜色,这里#0000把分割线设为透明色
2.然后再在外面定义一个消息的实体类People
public class People{
private String name; //姓名
private int age; //年龄
public Msg(String name,int age){
this.name = name;
this.age = age;
}
//加载get方法
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
3.然后在layout文件新建一个item.xml,表示ListView子项的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="23sp"
android:textStyle="bold"
android:text="jack"/>
<TextView
android:paddingLeft="10dp"
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="23sp"
android:textStyle="bold"
android:text="23"/>
</LinearLayout>
这表示ListView的一行,左边显示name,右边显示age,text的样式是粗体
4.接下来就要创建ListView的适配器类了,让他继承BaseAdaper
public class MyAdapter extends BaseAdapet{
private int resourceId;
public MyAdapter (Context context,int itemId,List<People> list){
super(context,itemId,list);
resourceId = id;
}
@override
public View getView(int position,view convertView,ViewGroup parent){
People people = getItem(position);
View view;
ViewHolder viewHolder;
if(convertView==null){
view = LayoutInflate.from(getContext()).inflate(resourceId,null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView)view.findViewById(R.id.tv_name);
viewHolder.age = (TextView)view.findViewById(R.id.tv_age);
view.setTag(viewHolder); //将ViewHolder存储在view里面,方便下次取出
}
else{
view = convertView;
viewHolder = (ViewHolder)view.getTag();
}
viewHolder.name.setText(people.getName());
viewHolder.age.setText(people.getAge());
return view;
}
class ViewHolder{
TextView name;
TextView age;
}
}
我们主要通过getView来设置返回的子项view,首先我们通过重写父类的一组构造函数,用于将上下文、ListView子布局的id,数据都传递进来,在getView中,我们通过getItem方法获取当前people的实例,然后通过LayoutInflate为这个子项加载我们的布局,接着调用view的findViewById()方法来获取两个TextView的实例。为了提高ListView的运行效率,不用每次更新数据都重新加载布局,在快速滚动时表现更好的性能,增加了一个判断,如果convertView为空,我们就加载布局,不为空我们就对它进行重用。而且我们添加了一个ViewHolder内部类,当convertView为空时,把控件实例放到ViewHolder中,不为空时又可以重新调用View的getTage()方法,这样所有控件的实例都缓存在ViewHolder里面了,没必要每次都通过findViewById()重新获取实例了。
5.最后肯定在MainActivity里面修改代码,把数据传进适配器,再把适配器赋给ListView,那么我们的工作就完成了
下面是关键代码
private List<People> peopleList = new ArratList<People>();
peivate ListView lv_show;
onCreate(){
lv_show = (ListView)findViewById(R.id.lv_show);
initData(); //初始化人物数据
MyAdapet myAdaper = new MyAdapter(MainActivity,this,R.layout.item,peopleList);
lv_show.setAdapter(myAdapter);
}
initData(){
People FirstPeople = new People("张三",18);
People SecondPeople = new People("李四",20);
People ThridPeople = new People("王五",22);
peopleList.add(FirstPeople);
peopleList.add(SecondPeople);
peopleList.add(ThridPeople);
}
至此,一个ListView就建立起来了