Android 如果ConvertView属性不为null,是否需要配置它?

Android 如果ConvertView属性不为null,是否需要配置它?,android,android-adapter,Android,Android Adapter,在自定义适配器中,如何知道是否需要重新配置转换视图 public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = (ImageView) mInflater.inflate(R.layout.avatar, parent, false); // S

在自定义
适配器中
,如何知道是否需要重新配置
转换视图

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {
        imageView = (ImageView) mInflater.inflate(R.layout.avatar, parent, false);

        // Should this 2 lines of code be here ?
        User user = mUserList.getUserAt(position);
        user.setAvatar(imageView);
    } else {
        imageView = (ImageView) convertView;
    }

    // or here ?
    User user = mUserList.getUserAt(position);
    user.setAvatar(imageView);

    return imageView;
}

我认为如果它被回收,我就不需要重置用户的化身,但我经常看到配置发生在
if
块之外。为什么会这样?

我总是在
if
块之外配置视图。您在getView方法中获得的这个convertView可能(而且很可能会)是通过之前对getView的调用为另一个用户设置的,因为ListView的策略是在项目视图离开屏幕时重用它们。如果你没有设置一个合适的化身,你将有一个错误的为这个项目。当然,您不需要重置独立于具体位置(如背景)的属性

例如,分为两部分:执行充气和(大部分)位置独立设置的newView和分配实际位置相关数据的bindView


这也可能发生,你会得到完全相同的看法,你用这个职位早些时候。当然,在这种情况下可以避免重置视图,但需要检查此视图中的数据是否有效。设置并检查视图是我想到的最明显的解决方案。

我总是在
if
块之外配置视图。您在getView方法中获得的这个convertView可能(而且很可能会)是通过之前对getView的调用为另一个用户设置的,因为ListView的策略是在项目视图离开屏幕时重用它们。如果你没有设置一个合适的化身,你将有一个错误的为这个项目。当然,您不需要重置独立于具体位置(如背景)的属性

例如,分为两部分:执行充气和(大部分)位置独立设置的newView和分配实际位置相关数据的bindView


这也可能发生,你会得到完全相同的看法,你用这个职位早些时候。当然,在这种情况下可以避免重置视图,但需要检查此视图中的数据是否有效。设置并检查视图是我想到的一个最明显的解决方案。

它不是真正回收的,它只是意味着您需要根据新位置用新数据填充“回收的”视图。如果你不这样做,这一行将充满旧的数据,这些数据在屏幕上应该不再可见,因为你滚动了它的位置


因此,简而言之,每次调用getView()时,您都必须使用新数据重新配置视图(如果代码中有
块,则在
之外)。

它不是真正回收的,它只是意味着您需要根据其新位置用新数据填充“回收的”视图。如果你不这样做,这一行将充满旧的数据,这些数据在屏幕上应该不再可见,因为你滚动了它的位置


因此,简而言之,每次调用getView()时,您都必须使用新数据重新配置视图(如果代码中有
块,则在
之外)。

您的问题只是理解listview

所以在这里,我将向您说明它是如何工作的

假设listview必须包含20个项目,但当前屏幕只能容纳8个项目(在imageview中为列表项目)

当listview试图获取
1---8th
的项目时,它会将
convertView
返回为
null
,因为尚未发生对象回收

但是,当您尝试滚动时,在我们的例子中(向上滚动!

以这种方式,listview只需管理第8个(在我们的例子中)即可显示任意数量的项目

如果我们向下滚动,则会发生相反的情况

因此,在convert-view(null或not)的基础上,您必须设计逻辑来创建和填充或填充。


希望这将对您有所帮助。

您的问题仅限于了解listview

所以在这里,我将向您说明它是如何工作的

假设listview必须包含20个项目,但当前屏幕只能容纳8个项目(在imageview中为列表项目)

当listview试图获取
1---8th
的项目时,它会将
convertView
返回为
null
,因为尚未发生对象回收

但是,当您尝试滚动时,在我们的例子中(向上滚动!

以这种方式,listview只需管理第8个(在我们的例子中)即可显示任意数量的项目

如果我们向下滚动,则会发生相反的情况

因此,在convert-view(null或not)的基础上,您必须设计逻辑来创建和填充或填充。

希望这对你有帮助

the 1st element of the list will be recycled when go out of screen, and will be supplied as convertView for 9th item.