Android ListView 适配器(Adapter)优化

本文也是转载的,以留着备用。

Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。

优化的思路两种:

1. View的重用 
    View的每次创建是比较耗时的,因此
对于getview方法传入的convertView应充分利用 != null的判断

2.ViewHolder的应用

View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象

下面是优化后的代码供参考:

 1 public class MyAdapter extends BaseAdapter {
2 private Context mContext;
3 private LayoutInflater mInflater;
4
5 public MyAdapter(Context context) {
6 this.mContext = context;
7 mInflater = LayoutInflater.from(mContext);
8 }
9
10 public int getCount() {
11
12 return mmsList.size();
13 }
14
15 public Object getItem(int arg0) {
16
17 return arg0;
18 }
19
20 public long getItemId(int arg0) {
21
22 return arg0;
23 }
24
25 public View getView(int position, View convertView, ViewGroup parent) {
26
27 ViewHolder holder = null;
28 if (convertView == null) {
29
30 holder = new ViewHolder();
31
32 convertView = mInflater.inflate(R.layout.mmslistitem, null);
33 holder.img = (ImageView) convertView.findViewById(R.id.mmsflag);
34 holder.subject = (TextView) convertView
35 .findViewById(R.id.mmssubject);
36 holder.date = (TextView) convertView.findViewById(R.id.mmsdate);
37
38 convertView.setTag(holder);
39
40 } else {
41
42 holder = (ViewHolder) convertView.getTag();
43 }
44
45 MMSDBItem mmsItem = mmsList.get(position);
46
47 holder.subject.setText(mmsItem.getSubject());
48 String today = DateFormat.format("yyyy-MM-dd",
49 System.currentTimeMillis()).toString();
50 String dateStr = DateFormat.format("yyyy-MM-dd kk:mm",
51 mmsItem.getDate()).toString();
52
53 holder.date.setText(dateStr);
54
55 if (mmsItem.getFlag() == 0) {
56 holder.img.setBackgroundResource(R.drawable.new_message_32);
57 } else {
58 holder.img
59 .setBackgroundResource(R.drawable.message_already_read_32);
60 }
61
62 return convertView;
63 }
64
65 public final class ViewHolder {
66 public ImageView img;
67 public TextView subject;
68 public TextView date;
69
}
70 }

  

posted @ 2011-08-11 18:22  水向东流  阅读(800)  评论(0编辑  收藏  举报