我在适配器扩展覆盖getView:
中看到了很多@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.whatever, null);
}
我在语义上得到了正在发生的事情 - “如果convertView为null然后膨胀它”,但我真的不明白为什么 - convertView的什么情况会为null,在什么情况下它已经是一个View?
另外(我知道“每个帖子有1个问题”),但是因为它与上面的有关 - 在inflate方法中究竟发生了什么?我知道它通常做了什么(“膨胀”要解析和填充的视图资源),但不完全了解它...
TYIA
答案 0 :(得分:8)
AFAIK,这就是getView的工作原理。
假设您有一个包含50个项目的列表,并且您一次只能看到5个项目。 getView最初将被调用5次,每行的convertView将为null,并且应该对新行进行膨胀。
当您滚动列表时,将再次调用getView,因为下一行在屏幕上可见。现在,由于已为列表呈现了5行,因此将通过使用新值更新现有行来回收这些行以显示新行。在这种情况下,convertView将不为null。
答案 1 :(得分:3)
假设您的列表适配器有1000个对象。每个对象都由一个视图表示。在电话屏幕上只有大约10个这样的视图。您可以滚动列表以查看更多项目。有些项目因为你滚动而消失了。框架创建更多视图是没有意义的,因为它们与刚刚看不到的视图完全相同。因此,框架可以重用之前创建的一些视图,因此它通过为您提供非空convertView
来为您提供这种可能性。
在inflate方法期间,View对象是从某些XML资源创建的。 XML资源具有足以使该View创建的View的描述,因此inflate
方法执行该创建。所以没有视图 - 你通过膨胀创建一个新视图,已经有一个视图 - 你可以重复使用它(你没有,但你应该)
答案 2 :(得分:2)
有关完整信息,我建议您观看此video
它会告诉你很多信息包括getView()