面试记录第八节——(listview面试)
来源:互联网 发布:java发送邮件工具类 编辑:程序博客网 时间:2024/06/06 00:45
一、问:什么是listview?
答:他是一个能将数据集合以动态滚动的方式展示到用户界面上的view
二、问:listview适配器模式是什么?
答:adapter为每一个数据制作view,然后交给listview来显示。adapter的出现就是保证数据和view 的分离。这也是一种mvc的设计模式。他只会通过adapter来处理数据源。同时adapter的接口又是统一的,所以这会让listview不用去担心数据适配方面的问题。
三、问:listview的recycleBin机制是什么?
答:adapter为每一个数据制作view,然后交给listview来显示。adapter的出现就是保证数据和view 的分离。这也是一种mvc的设计模式。他只会通过adapter来处理数据源。同时adapter的接口又是统一的,所以这会让listview不用去担心数据适配方面的问题。
有人会问,listview如果数据有成千上万的数据,会不会造成内存泄露,这里是不会,因为这牵扯到recycle机制。
问:recycle机制是什么东西?
答:在源码中,listview继承的是AbsListView,而recycelBin其实就是AbListview里面的内部类(如图02)。
而在这个内部类中有三个重要的存储数组。
1、private View[] mActiveViews = new View[0];//这里面存储的是用户可见的view,也就是屏幕当前显示的view。而且这些view可以被复用。
2、private ArrayList[] mScrapViews;//他是一个二位数组,他表示所有废弃的view。而这些废弃的view就是存储在mScrapViews中。
3、private ArrayList mCurrentScrap;//当前被划出去的,就是刚刚被划出去的。
例如下图03
也就是显示在当前屏幕可间范围的数据是存储在内存中的,其他的都是存储在recycleBin当中。加入元素6将要显示在界面中的时候,又会通过getview获取到元素0的这个位置,然后达到复用的效果。
四、问:listview的优化问题?
答:convertView重用/viewHolder
在geiview()方法里面,他有一个参数叫做convertView,而它的作用就是缓存的。利用缓存的convertView可以做判断,如果缓存中它不存在,也就是convertView为空的时候我们才会创建它。如果已经存在就可以调用已经有的view。
- 例如下面代码
public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder viewHolder; //convertView为空的时候我们才会创建。 if(convertView==null){ viewHolder=new ViewHolder(); convertView = inflater.inflate(R.layout.two_activity_untreted_item, null); viewHolder.untreted_name_tv=(TextView) convertView.findViewById( convertView.setTag(viewHolder); }else{ //如果已经存在就可以调用已经有的view。 viewHolder=(ViewHolder)convertView.getTag(); } }这种方在初次显示的时候,每显示一个item,就会就会调用一次getView()方法,并且每次调用getview()方法时convertView 都为空。当它移除屏幕的时候convertView就不在为空,他就是移除屏幕的那个item值。所以convertView是listview性能优化最重要的一点。viewHolder:viewHolder的作用,可以避免多次的在getView进行findviewById(),我们知道所有的view都是二叉树的结构,每次遍历都很耗时,利用viewHolder减少findviewById()的次数,就提高了遍历的时间。注意:在getview方法中少做耗时操作,这样可以保证listview滑动的流程性。
阅读全文
0 0
- 面试记录第八节——(listview面试)
- 面试记录第十八节——(冷启动)
- Ant Design of React—第八节
- 面试小记——listview的问题
- 面试记录(三)
- 游戏公司面试记录——chapter 1(久游网)
- 面试体记录第四节——(handler)
- 面试记录第十节——(代码混淆)
- 面试记录第十一节——(volley框架)
- 面试记录第十二节——(Butterknife 注入框架)
- 面试记录第十三节——(什么是anr)
- 面试记录第十四节——(什么是oom)
- 面试记录第十六节——(内存泄露)
- 面试记录第十七节——(内存管理机制概述)
- 面试记录第十九节——(MVC)
- 面试记录第二十节——(MVP讲解)
- 面试记录第二十二节——(lint检查)
- 面试记录第二十四节——(多线程)
- Spring Controller 获取中文参数值乱码问题解决
- keepalived+nginx双机热备+负载均衡 非抢占模式
- Android Notification 详解
- Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法
- HDU3709
- 面试记录第八节——(listview面试)
- .net 简易数据库操作框架1.2
- 学习笔记:ES6之数值扩展
- SSM ---数据库语句 MApper.xml
- 怎么发表期刊
- main函数调用自己本身
- centos7 安装telent和telnet-server
- Java下利用Jackson进行JSON解析和序列化
- pc 与移动设备的判断