您应该扩展BaseAdapter并为每个项目提供您自己的布局 (getView())。不要忘记管理视图回收,并可能使用 ViewHolder 范例。
编辑
我没有大量使用 ListAdpater,因为它只绑定到 ListView。有时我需要一个用于 GridView 的适配器,而 BaseAdapter 为我提供了所有用例的足够自由。
BaseAdapter 示例:
public class FanAdapter extends BaseAdapter {
private List<Fan> mFans;
private Activity mContext;
public FanAdapter(Activity context, List<Fan> fans) {
mContext = context;
mFans = fans;
}
private class ViewHolder {
public ImageView image;
public TextView firstName;
public TextView lastName;
}
@Override
public View getView(int position, View view, ViewGroup container) {
if (view == null) {
view = LayoutInflater.from(mContext).inflate(R.layout.fan_item, container, false);
}
ViewHolder viewHolder = (ViewHolder) view.getTag();
if(viewHolder == null){
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) view.findViewById(R.id.image);
viewHolder.firstName = (TextView) view.findViewById(R.id.firstname);
viewHolder.lastName = (TextView) view.findViewById(R.id.lastname);
view.setTag(viewHolder);
}
// setting here values to the fields of my items from my fan object
viewHolder.firstName.setText(fan.getFirstName());
(...)
return view;
}
@Override
public int getCount() {
if (mFans != null) {
return mFans.size();
} else {
return 0;
}
}
@Override
public Object getItem(int position) {
return mFans.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
您可以将它与包含 ListView 或 ListActivity 的 Activity 一起使用(在其布局中有一个具有特殊 id 的 ListView):
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent" />
这样,您的 ListActivity 将膨胀视图将能够进行 findViewById() 调用,而 getListView() 将返回此内部 listView。这是一个小技巧,您可以将自己的 listView 与另一个 id 放在一起,然后自己制作 findViewById()。对于 ListActivity,还有另一个 hack:如果 ListActivity 再次找到一个带有特殊 id 的空视图,它将在列表为空时显示:
<include
android:id="@+id/empty"
layout="@layout/empty"
android:visibility="gone"
android:layout_gravity="center" />
然后在你的listView上,无论你使用的是Activity还是ListActivity,你都可以在ListView上设置你的适配器:
getListView().setAdapter(new FanAdapter(this, myFanDataArray)));