适配器converView有时为null

时间:2015-09-21 08:33:25

标签: android listview

我有一个ListView和一个适配器。可以在下面找到简单的getView代码。

public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        Log.d("mzule", "convertView is null " + position);
        convertView = mInflater.inflate(R.layout.item_cheap_layout, null);
    }
    return convertView;
}

当我构建并运行应用程序时。我在下面写了日志。

D/mzule   (25020): converView is null a 0
D/mzule   (25020): converView is null a 1
D/mzule   (25020): converView is null a 2
D/mzule   (25020): converView is null a 3
D/mzule   (25020): converView is null a 4
D/mzule   (25020): converView is null a 5
D/mzule   (25020): converView is null a 16
D/mzule   (25020): converView is null a 32
D/mzule   (25020): converView is null a 47
D/mzule   (25020): converView is null a 38

很明显,前6个converViews为空。但我无法弄清楚为什么16th,32th,47th和38th convertView为null。它使我的ListView滞后。

3 个答案:

答案 0 :(得分:-1)

看看here。 ListView的回收机制如何运作是非常好的解释。

答案 1 :(得分:-1)

首先,方法getView的调用者会将这样的参数设置为:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if($somethingToCheck){
       echo 'hey!';
    }else{ echo 'BAD!'; }
}

调用者(AdapterView)不会将从getView返回的视图放到convertView中,直到你在getView中返回一个视图。首先,它会将null设置为convertView。

答案 2 :(得分:-1)

您需要了解listview的工作原理。布局通胀很昂贵。 Listview致力于视图回收的概念。 Listview将废料视图用于不可见的视图。每次ListView需要在屏幕上显示新行时,它都会从其适配器调用getView()方法。一旦你滚动并且一行离开屏幕,当一行被添加到屏幕时,该屏幕被移动到可循环池中。如果传入的行在可循环池中,它将从池中获取视图,否则将创建新行。希望它有所帮助:)