如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有觉得有什么不好的。直到最近在慕课网上看到鸿洋大神讲的“机器人小慕”和“万能适配器”两节课,才对BaseAdapter有所了解。看了鸿洋大神的课程之后,我又上网搜了几个博客,也看了一些源码和文档,于是打算写一个帖子来记录一下自己的学习历程。
在今天的帖子中,我们从一个最基本的实现BaseAdapter的适配器开始,先介绍ListView性能优化(convertView结合ViewHolder类),再将其封装起来,最后达到可以像SimpleAdapter一样可以一行代码搞定一个ListView的数据绑定。
总结一下,本帖子要实现的功能:
- 为一个继承自BaseAdapter的原始的Adapter添加ViewHolder,达到缓存的功能
- 将优化后的ListView进行封装,实现一行代码为ListView绑定数据
一、最原始的适配器类的实现
最原始的思想就是常见一个继承自BaseAdapter的适配器类,在getView()方法中找到子View的布局,获取到子View中的控件,再为其绑定数据。简略代码如下:
1 @Override 2 public View getView(int position, View convertView, ViewGroup parent) { 3 convertView = inflater.inflate(R.layout.sideworks_main_userlist_item, parent, false); 4 ImageView userPhoto = (ImageView) convertView.findViewById(R.id.find_listitem_photo); 5 TextView userName = (TextView) convertView.findViewById(R.id.find_listitem_name); 6 User user = userList.get(position); 7 userPhoto.setImageResource(user.getPhotoRes()); 8 userName.setText(user.getUserName()); 9 return convertView; 10 }
这样写代码理论上是没有问题的,但是,看过源码的人都知道,convertView这个参数指的是 The old view to reuse, if possible. 也就是说,convertView是一个以前用过的子View,如果它存在的话,就可以复用它,即只要ListView中存在一个布局和这个子View一样的子View,那么那个子View就可以复用这个convertView。这样就有了一个缓存的机制,也就是靠这个机制,我们可以达到ListView性能优化的目的。
二、convertView结合ViewHolder类实现ListView性能优化
未完待续。。。。。。