今天我们进一步学习ListView,重点学习他的getView方法和其中的convertView对象。
首先我们将getCount方法里改成return 1000;然后快速滑动,快点,再快点。
这里推荐一个属性:fastScrollEnabled,设置一个垂直快速滚动条,拖动他,再快点。
android:fastScrollEnabled="true"
终于崩溃,这就对了。
查看日志,发现了传说中的OOM,
神马情况?
主要是我们快速滑动导致快速调用getView,
快速调用getView导致快速创建TextView,然后申请内存的速度>释放内存的速度。
创建虚拟机的VM Heap有限,终于导致OOM内存溢出。
我们可以log验证一下显示一个item调用一次getView():
Log.d(TAG, "权兴权意-" + position);//显示一个调用一次
那么怎么办呢?这时就需要复用对象,我们用convertView历史缓存对象。
如果为空重新创建,如果不空则直接复用:
//获取View,作为ListView的一个条目显示
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
TextView tv;
//View convertView 历史缓存对象
if (convertView == null){
tv = new TextView(MainActivity.this);
Log.d(TAG, "创建ListView对象-" + position);//显示一个调用一次
}else{
tv = (TextView) convertView;
Log.d(TAG, "复用ListView对象-" + position);//显示一个调用一次
}
//Log.d(TAG, "权兴权意-" + position);//显示一个调用一次
//TextView tv = new TextView(MainActivity.this);
tv.setText("权兴权意-" + position);
return tv;
}
这样就能避免OOM,给力的convertView。