了解完ListView的基础属性之后,接下来介绍下用法,使用ListView必须要有一个适配器,适配器又分为:
Adapter :
ArrayAdapter<T> | 用来绑定一个数组,支持泛型操作 |
SimpleAdapter | 用来绑定在xml中定义的控件对应的数据 |
SimpleCursorAdapter | 用来绑定游标得到的数据 |
BaseAdapter | 通用的基础适配器 |
BaseAdapter的使用方法:
首先在布局文件中申请个ListView
<ListView
android:id="@+id/lv_contacrts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
ListView都需要一个适配器,所以在定义一个类继承BaseAdapter,方便在主Activity中调用,
package com.example.listviewdemo;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
public class ContactsAdapter extends BaseAdapter{
</pre><pre name="code" class="html"><span style="white-space:pre"> private List<People> peopleList = new ArrayList<People>();</span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> People people01 = new People(1, R.drawable.image_00, "</span>小白<span style="white-space:pre">", "0000000000000001");
<span style="white-space:pre"> </span>People people02 = new People(2, R.drawable.image_01, "</span>小红<span style="white-space:pre">", "0000000000000002");
<span style="white-space:pre"> </span>People people03 = new People(3, R.drawable.image_02, "</span>小黑<span style="white-space:pre">", "0000000000000003");</span>
<span style="white-space:pre"> peopleList .add(people01);
<span style="white-space:pre"> </span>peopleList .add(people02);
<span style="white-space:pre"> </span>peopleList .add(people03);</span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//ListView子项集合的大小
@Override
public int getCount() {
// TODO Auto-generated method stub
return peopleList.size();
}
<span style="white-space:pre"> </span>//<span style="font-family: Arial, Helvetica, sans-serif;">ListView子项的位置</span>
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return peopleList.get(position);
}
<span style="white-space:pre"> </span>//<span style="font-family: Arial, Helvetica, sans-serif;">ListView子项位置的Id</span>
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return peopleList.get(position).getId();
}
<span style="white-space:pre"> </span>//ListView子项返回 View
@Override
public View getView(int position, View convertView, ViewGroup parent) {
<span style="color:#ff0000;">// ListView的优化,注意优化,不然加载大量图片信息的时候,系统承受不了。</span>
View view = converView;
<span style="white-space:pre"> </span>ViewHolder vh = null;
<span style="white-space:pre"> </span>//如果回收机制中没有可利用的View,在创建新的View
<span style="white-space:pre"> </span>if(view == null){
<span style="white-space:pre"> </span>//导入自定义子项的布局文件
<span style="white-space:pre"> </span>view = LayoutInflater.from(ListViewDemoActivity.this). inflate(R.layout.contacts_view, null);
<span style="white-space:pre"> </span>//实例化布局文件的控件
<span style="white-space:pre"> </span>vh.ivAvatar = (ImageView) view.findViewById(R.id.iv_avatar);
<span style="white-space:pre"> </span>vh.tvName = (TextView) view.findViewById(R.id.tv_name);
<span style="white-space:pre"> </span>vh.tvNumber = (TextView) view.findViewById(R.id.iv_number);
<span style="white-space:pre"> </span>view.setTag(vh);
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>//回收机制中有可利用的View,则拿过来重复利用,不在创建新的View.
<span style="white-space:pre"> </span>vh = (ViewHolder) view.getTag();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>People people = peopleList.get(position);
<span style="white-space:pre"> </span>if(people != null){
<span style="white-space:pre"> </span>vh.ivAvatar.setImageResource(people.getAvatarId());
<span style="white-space:pre"> </span>vh.tvName.setText(people.getName());
<span style="white-space:pre"> </span>vh.tvNumber.setText(people.getPhoneNumber());
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return view;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//将布局文件中使用到的对象封装到一个类中,方便调用。
<span style="white-space:pre"> </span>private class ViewHolder{
<span style="white-space:pre"> </span>ImageView ivAvatar;
<span style="white-space:pre"> </span>TextView tvName;
<span style="white-space:pre"> </span>TextView tvNumber;
<span style="white-space:pre"> </span>}
}
}
子项的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
>
<ImageView
android:id="@+id/iv_avatar"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_centerVertical="true"
android:background="#d7d7d7"
/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_toRightOf="@+id/iv_avatar"
android:layout_alignTop="@+id/iv_avatar"
android:layout_marginLeft="8dp"
/>
<TextView
android:id="@+id/iv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_name"
android:layout_toRightOf="@+id/iv_avatar"
android:layout_marginLeft="8dp"
/>
</RelativeLayout>
package com.example.listviewoptimize;
public class People {
private long id;
private int avatarId;
private String name;
private String phoneNumber;
public People(long id,int avatarId,String name,String phoneNumber){
this.id = id;
this.avatarId = avatarId;
this.name = name ;
this.phoneNumber = phoneNumber;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getAvatarId() {
return avatarId;
}
public void setAvatarId(int avatarId) {
this.avatarId = avatarId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
适配器定好之后,只要在主Activity中调用就可以实现ListView的功能了
lvContacts = (ListView) findViewById(R.id.lv_list_view);
mAdapter = new <span style="font-family: Arial, Helvetica, sans-serif;">ContactsAdapter</span>();
lvContacts.setAdapter(mAdapter);