3min初识ListView(2)-getView和convertView

今天我们进一步学习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。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值