在BaseAdapter中调用getView的getView行为

时间:2014-03-21 10:04:39

标签: android android-listview

假设我有一个20个元素的列表视图,一次显示8个元素到屏幕。

我注意到当我在listview上执行fling操作时,比我正常滚动列表时更多次调用getView(在两种情况下都是从上到下滚动/投掷)。问题是为什么投掷getView比普通滚动调用次数多?

我知道有一些方法可以使getView高效,但是我想了解为什么更频繁地调用getView来进行fling操作。

1 个答案:

答案 0 :(得分:0)

getView()方法的行为使得在屏幕中更改视图时将多次调用它。因此,无论何时滚动ListView,它都会回收旧记录,并通过调用getView()方法来扩充新记录。因此,每次滚动列表时都会重新创建视图,并在滚动停止时显示新记录。

构建适配器以重用视图,当滚动视图使其不再可见时,它可用于出现的新视图之一。这个重用的View是convertView。如果这是null,则意味着没有回收的View,我们必须创建一个新的View,否则我们应该使用它来避免创建新的。

convertView用于回收。假设您有一个列表视图,一次只能显示10个项目,目前它正在显示项目1 - >项目10.当您向下滚动一个项目时,项目1将在屏幕外,并且将显示项目11。要为项目11生成视图,将调用getView()方法,此处convertView是项目1的视图(不再需要)。

因此,每当你执行此操作时,您的滚动速度会更快,因此您的适配器将调用getView()方法,因为许多记录将进入屏幕。这就是为什么它显示getView()方法的不同计数。

因此,为项目11创建一个新的View对象(成本很高),为什么不重用convertView? 我们只检查convertView是否为null,如果为null则创建新视图,否则重新使用convertView