最新版本:Android中级进阶二 ListView巧用convertView
在Android中级进阶一ListView使用BaseAdapte我们使用了自己的DownloadAdapter,并提到了getView()是来画ListView的每一个条目的。我们把每一个条目都用一个对象来表示,下面的ViewHolder来表示这个对象的类:
- public class ViewHolder {
- public ImageView mStatusIV;
- public TextView mNameTV;
- public ProgressBar mProgressBar;
- public TextView mCurrentSizeTV;
- public TextView mTotalSizeTV;
- public Button mStatusBtn;
- ……
- }
然后对这个ViewHolder进行实例化,就好了,但是假设我的数据是需要及时刷新的,或者根据一定条件刷新,那getView()方法岂不是需要刷新若干次,那我的UI效率岂不是很低了吗?既然问题提出来了,那一定有解决的办法,我们具体的看下getView()方法:
- //这个是关键,是用来对应每一行具体数据的控件的view
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- return null;
- }
每一个参数意义:
position是通过getItemId()获得,既是对象的id,这样就可以合理显示每一个对象存储的数据及控件view;
convertView是则是用来画正确的view的对象,ViewHolder实例之后,我们用convertView来转化ViewHolder实例的;
该解决我们刚刚提出来的问题了,获得较高的UI效率的关键就是convertView和ViewHolder之间的转换过程;Android中系统自带有recycling View机制,所以这样子设计看看效果如何:
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- final ViewHolder viewHolder ;
- if (convertView == null) {
- viewHolder = new ViewHolder();
- convertView = mInflater.inflate(R.layout.download_item, null);
- viewHolder.mStatusIV = (ImageView) convertView.findViewById(R.id.status_image);
- viewHolder.mNameTV = (TextView) convertView.findViewById(R.id.name_TV);
- <span style="white-space:pre"> </span>//......其他view
- convertView.setTag(viewHolder);
- } else {
- viewHolder = (ViewHolder) convertView.getTag();
- }
- // ......接下来可以对你的数据进行进一步的操作了
- return convertView;
- }
这样应该得到不错的缓解了,至于recycling View机制,待我在认真研究之后,再续上,谢谢!