今天我们一起来学习一下ListView背后的设计模式(MVC)和知之甚少的小优化,Android的优化有时很简单,仅仅就是一行代码的事。
几段话简单概括ListView的MVC设计模式:
ListView展示数据的原理-MVC(JavaWeb-Android):
Model模型数据-JavaBean
View视图-JSP-ListView
Controller控制器-Servlet-Adapter
接下来是ListView知之甚少的小优化,他的高度和getView方法被调用的次数。
首先修改代码:
@Override
public int getCount() {
return 6;
}
return 6 即显示6条数据。
相应的调用6次getView方法,我们在里面Log一下输出内容。
//获取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;
}
接下来我们在布局文件中将他的高度改为包裹内容。
<span style="font-size:18px;">android:layout_height="wrap_content"</span>
运行,我们看一下输出结果:
说好的调用6次打印6遍,这都调用了多少次?
稍安勿躁,我们将高度改为填充,
<span style="font-size:18px;"> android:layout_height="match_parent"
</span>
运行,我们看一下输出结果:
说好的调用6次打印6遍,多一次少一次都不行。
下面是揭秘时间,到底是什么鬼?
现假设屏幕高度480,ListView的一条item高度48。
我们先看高度填充父控件(match),ListView可以很快计算出他可以加载几条内容,可不可以加载全。
因为480/48=10,所以不多不少调用6次getView。
那如果高度是包裹内容(wrap),ListView已经懵逼。
因为此时 ?/48=?,ListView必须多次校验才知道自己可以加载几条内容,可不可以加载全。
所以将调用多次getView。
小结:ListView小优化,控件高度最好设置为匹配父控件。
感慨:Android的优化有时很简单,仅仅就是一行代码的事。