ListView复用和优化详解

1.ListView为什么会存在Item复用问题?

答:ListView内部为了优化而建立的复用机制,在getView方法中第二个参数就是ListView传递给我们用来进行复用的view,如果不想复用ListView传递过来的view,那么每次都需要创建一个新的view进行返回,这样的话就不会出现复用的问题,但是却是非常消耗内存的,性能也不是很好。

2.为什么上述的getView方法中第二个参数convertView有时候位null呢?

答:因为ListView默认缓存一页的View,所谓的一页也就是你当前Listview界面上有几个Item可以显示,ListView就缓存几个。当显示第一页的时候,由于没有一个Item被创建,所以第一页的Item的getView方法中的第二个参数为空。

3.为什么需要ViewHolder呢?这个是干嘛的。

itemView的复用是为了提高性能,那么ViewHolder同样也是为了提高性能。我们都知道要显示列表数据就要在getView方法中拿到对应下标的数据然后对ItemView中的控件进行设值,所以我们需要用到findviewbyid来找到控件,并且强转成我们想要的类型,然后对其进行设值,而findViewById方法在列表滚动的时候频繁调用getView()方法也是一个比较消耗性能的操作,所以ViewHolder来了。为了在列表滚动的时候,频繁调用getView方法尽量提高性能,我们可以使用一个普通类,这个类通常就起名为viewholder了,当创建itemview的时候,我们也把里面要用到的控件找到放到我们的viewHolder里,然后再通过itemView.setTag()方法实现一个itemView 和一个ViewHolder进行绑定。经过上述的操作,如果在getView()方法中传入了复用的itemView,那么我们就可以从里面拿出对应的ViewHolder,从而避免了去调用多个findviewbyid去找到控件设值,因为之前已经把找到的控件都放到了viewHolder中。当然如果我们的ItemView中只有一个控件,那么ViewHolder就不需要了,我们就可以直接将该控件和ItemView进行绑定。

4.getView方法在什么时候调用?

答:在每一个item从不可见变为可见的时候。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容