在开发android 应用的时候,我们经常需要使用到 listview, 下面写一个一般的adapter 的代码贴出来,与大家共享一下:
public class TraceMapAdapter extends BaseAdapter {
private static final int VIEWTYPE1 = 0;// 类型1
private static final int VIEWTYPE2 = 1;// 类型2
------ 有时候,我们的listview 里面的所有项的展现形式不是完全一样的,需要多种类型,这时可以在adapter里面定义不同的类型
private ArrayList<FootMark> footList; -----保存数据
public TraceMapAdapter(Context context, ArrayList<FootMark> footList) {
super(context);
this.footList = footList;
}
public void setList(ArrayList<FootMark> footList) {
this.footList = footList;
} -----用于listview 的数据改变时,进行数据更新
@Override
public int getCount() {
return footList == null ? 0 : footList.size();
} -----获取listview的条目个数,这个数目要对
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getItemViewType(int position) {
if (position == footList.size() - 1) {
return VIEWTYPE2;
} else {
return VIEWTYPE1;
}
}-----获取每一项的类型
@Override
public int getViewTypeCount() {
return 2;
}-----获取所有类型的个数,我们这里只有两种类型
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
if (convertView == null) { ------listview 有复用的概念,convertView为可复用的view,当convertView不可空时,就不用重新创建view了
convertView = get(type); ----创建我们需要使用的view
}
FootMark foot = footList.get(position);
setData(type, convertView, foot, position); -----设置view里面的数据
convertView.setTag(foot); -----设置view的tag, 可能会使用到
return convertView;
}-----获取每一项的view
private View get(int type) {
View view = null;
switch (type) {
case VIEWTYPE1:
view = LayoutInflater.from(mContext).inflate(
R.layout.listitem_trace, null);
TextHolder textHolder1 = new TextHolder();
findViewText(textHolder1, view);
view.setTag(R.id.TAG, textHolder1);
break;
case VIEWTYPE2:
view = LayoutInflater.from(mContext).inflate(
R.layout.listitem_trace_last, null);
TextHolder textHolder2 = new TextHolder();
findViewText(textHolder2, view);
view.setTag(R.id.TAG, textHolder2);
break;
}
return view;
}
private void setData(int type, View view, FootMark foot, int position) {
switch (type) {
case VIEWTYPE1:
TextHolder textHolder1 = (TextHolder) view.getTag(R.id.TAG);
setDataText(textHolder1, foot, type, position);
break;
case VIEWTYPE2:
TextHolder textHolder2 = (TextHolder) view.getTag(R.id.TAG);
setDataText(textHolder2, foot, type, position);
break;
}
}
private void setDataText(TextHolder holder, FootMark foot, int type, int position) {
holder.tracename.setText(foot.getlocation());
holder.tracetime.setText(foot.getcreate_time());
}
private void findViewText(TextHolder holder, View view) {
holder.tracename = (TextView) view.findViewById(R.id.tracename);
holder.tracetime = (TextView) view.findViewById(R.id.tracetime);
}
// 静态类用于获取和处理列表中每个条目数据的更新
private static class TextHolder {
TextView tracename;
TextView tracetime;
}
}
上面就是一般的自定义adapter的写法。
还有一个点就是,在adapter 里面,如果每一项都有imageview 需要从网络下载图片时,则需要注意,不能每次getview 的时候,都直接下载图片,否则当用力向下滑动时,每一个view 都去获取图片,会造成卡顿,一般的处理方法是,当 listview 处于滑动状态时,不去加载图片,当停止加载时,再去加载图片,这样可以有效避免卡顿。