3

我已经阅读了一些文章并观看了视频以了解其ListView工作原理。所以,假设我有 5 个项目的列表(所有项目都在屏幕上可见)。我的自定义适配器中有以下代码,它继承自BaseAdapter

@Override
public View getView(int position, View view, ViewGroup parent) {
    System.out.println("item position: " + position + " view " + view);

    if (view == null)
    {
        view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null);
    }
    return view;
}

当我运行此代码时,我在控制台中看到以下输出:

08-26 14:52:40.882: item position: 0 view null
08-26 14:52:40.883: item position: 1 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.883: item position: 2 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 0 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 1 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 2 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 0 view android.widget.RelativeLayout{88bc756 V.E...C.. ......I. 0,0-1080,65 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 1 view android.widget.RelativeLayout{1264e60 V.E...C.. ......I. 0,68-1080,133 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 2 view android.widget.RelativeLayout{36b089 V.E...C.. ......I. 0,136-1080,201 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{e1a12bb V.E...C.. ......I. 0,204-1080,269 #7f0e00b8 app:id/item_container}
08-26 14:52:40.885: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}

getView() view只是null为了这个0职位。看完后,我认为我有null前 5 次调用(直到所有可见的项目视图都没有初始化)。为什么只针对第一个?我错过了什么?

4

2 回答 2

1

ListView回收视图,因此第一次运行将是null因为您必须为视图充气。膨胀视图后,您应该重用相同的视图并仅更新内容以提高性能。我建议观看以下视频https://www.youtube.com/watch?v=wDBM6wVEO70,他们很好地解释了列表视图的工作原理。

于 2016-08-26T15:10:03.633 回答
0

这是视图的工厂方法。为了防止一次又一次地创建复杂的视图,您可以返回创建的视图并稍后将其作为框架工作的参数接收。

您应该检查是否可以重用您的视图(例如类型匹配,如果您有不同的线条可视化),然后出于性能原因简单地使用该视图而不是创建一个新视图(膨胀一个新视图)。

视图膨胀涉及解析 XML。并且是一项昂贵的操作。这就是 API 允许您重用组件的原因。这是 UI 开发中的常见模式。

这就是为什么您在第一次调用时使用 null ,然后在视图实例中使用。

于 2016-08-26T15:05:20.787 回答