Android ListView 适配器(Adapter)优化

假如想象 提交于 2020-02-10 02:01:12

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

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) convertView35                         .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.img59                         .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     }

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!