首页 > 学院 > 开发设计 > 正文

(转)ListView的优化之复用convertView和利用ViewHolder

2019-11-07 22:56:30
字体:
来源:转载
供稿:网友

原地址:http://blog.csdn.net/hellobenji/article/details/51800875

紧接着我把屏幕往下滑动了几下通过log可以看出来,(我是用log打印的方式将convertView打印出来了。倒着看,最后的VE前边的那一串数字变代表着一个convertView。从中可以看出来每个convertView都不一样)。每一次的滑动。都会产生一个新的convertView,如果有好几千行的话。那么肯定会造成内存的紧张。也会造成滑动的卡顿。所以需要进行优化。以下分别是进行优化和没有优化的代码//下边是没有优化的代码,从代码中可以看出来。不光没出现一个新的Item需要创建一个conver而且还需要不停的findViewById.于是进行了下边的优化@Overridepublic View getView( int position, View convertView, ViewGroup parent) {    // 加载 convertview    convertView = View. inflate( context , R.layout.item_main , null);    // 从 convertView 当中找到需要修改值的视图    TextView tv_item_Word = (TextView) convertView.findViewById(R.id. tv_item_word);    TextView tv_item_name = (TextView) convertView.findViewById(R.id. tv_item_name);    // 然后给各个视图装配数据    tv_item_word.setText( data.get(position).getPinyin().substring( 0, 1));    tv_item_name .setText( data.get(position).getName());    Log.i( "TAG" , "有没有复用 convertView" +convertView);    return convertView;}优化之后的代码,其实代码并不多。注释的多了而已。更方便理解//在这里声明一下 holder 就是为了在 else 里边用的时候不至于 是空的    ViewHolder holder;    // 通过加了 if (convertView != null) 这个判断条件。就省略了重复创建的浪费资源的情况    if (convertView == null) {        convertView = View.inflate ( context, R.layout.item_main , null);        holder = new ViewHolder();        holder. tv_item_name = (TextView) convertView.findViewById(R.id. tv_item_name);        holder. tv_item_word = (TextView) convertView.findViewById(R.id. tv_item_word);        //可以将 setTag 理解成为一种容器方法。先将初始化好的 holder 存储在 convertView 里边        convertView.setTag(holder);    } else {        //得到的 holder 是已经 findviewbyId 好了的。就不用再去 findviewbyid 了。也是一种优化        holder = (ViewHolder) convertView.getTag();      /*       加载数据的方法不能写在这里边。因为刚开始 convertVie==null 的时候是不执行的。也就是将       原来自己布局中的数据记载到了屏幕上       holder.tv_item_word.setText(data.get(position).getPinyin().substring(0, 1));        holder.tv_item_name.setText(data.get(position).getName());*/    }    // 装配数据    holder. tv_item_word.setText( data .get(position).getPinyin().substring( 0, 1));    holder.tv_item_name .setText( data.get(position).getName());    return convertView;}static class ViewHolder {    PRivate TextView tv_item_word;    private TextView tv_item_name;}//如果装配数据的的代码写在了else{}里边就会产生下边的现象;


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表