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从不可见变为可见的时候。

你可能感兴趣的:(ListView复用和优化详解)