0

在自定义adapter中,如何知道我是否需要重新配置convertView

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块之外。这是为什么?

4

3 回答 3

2

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

例如, CursorAdapter 将 getView分成两部分:newView,它执行膨胀和(主要)与位置无关的设置,以及分配实际位置相关数据的 bindView。

您也可能会获得与之前用于此职位的完全相同的视图。当然你可以避免在这种情况下重置视图,但是你需要检查这个视图中的数据是否有效。我认为设置然后检查 View 的标签是一个最明显的解决方案。

于 2012-12-25T04:48:54.977 回答
2

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

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

于 2012-12-25T07:05:01.140 回答
1

您的问题仅在于对 listview 的理解。

所以在这里我会让你清楚它是如何工作的?

假设列表视图必须包含20 个项目,但您当前的屏幕只能容纳(在屏幕上显示)8 个项目(列表项目,在您的情况下为 imageview)。

当列表视图尝试为其获取项目时,1----8th它将返回您convertViewnull因为尚未发生对象回收

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

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

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

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

因此,在转换视图(null 或 not)的基础上,您必须设计您的逻辑来创建和填充或填充。

希望这会帮助你。

于 2012-12-27T07:08:00.973 回答