我有一个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滞后。
答案 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()方法。一旦你滚动并且一行离开屏幕,当一行被添加到屏幕时,该屏幕被移动到可循环池中。如果传入的行在可循环池中,它将从池中获取视图,否则将创建新行。希望它有所帮助:)