面试记录第八节——(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滑动的流程性。
原创粉丝点击