/////////////////////////////getView优化////////////////////////////////// //基本优化: //①使用convertView重用,避免每次getView方法的时候,都去创建新的View //②使用ViewHolder来临时存储item中的控件,避免出现重复多次的findViewById,此操 //作也是消耗内存的操作 //③ListView的在布局中,不要设置自适应(wrap_content),这样会导致getView方法的重 //调用 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = mInflater.inflate(R.layout.lv_books_items, parent, false); viewHolder.tv_desc = (TextView) convertView.findViewById(R.id.tv_desc); viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); viewHolder.tv_price = (TextView) convertView.findViewById(R.id.tv_price); //setTag方法学习 stu4ViewPsetTag(); convertView.setTag(viewHolder); }else{ viewHolder=(ViewHolder)convertView.getTag(); } Log.e("convertView","当前的position:"+position+"当前的对象:"+convertView.toString()); return convertView; }
总结如下
①从listview中的item第一次显示开始到顶部的第一个item完全不可见以后,第一个item通过getview返回的view才会第一次保存在起来(具体如何保存,得研究源码,比如已全局的list列表保存,然后取的时候,再从列表中取对应的)。
②只有当前面有getview被保存过后,滑动显示新的item的时候,listView回调getView方法,才会传入对应convertView,否则传的null,已起到缓存作用。
③继续滑动的过程中,都会重复使用convertView,并按照第一个使用convertView的item之前的所有item的被缓存过的view顺序进行使用。
通过以上三点,最终提高了listView的去重复创建过多item的view的过程,对堆内存有一定的优化,提高了listView的性能。
|