android getView()如何在BaseAdapter中运行?

时间:2016-08-26 15:01:47

标签: android listview convertview

我已阅读了一些文章,并观看video以了解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() viewnull位置为0。看完之后我认为我前5次调用null(直到所有可见的项目视图都没有初始化)。为什么只为第一个?我错过了什么?

2 个答案:

答案 0 :(得分:1)

ListView会回收视图,因此第一次运行时会null,因为您必须对视图进行充气。一旦您为视图充气,您应该重复使用相同的视图,只更新内容以提高性能。我建议观看以下视频https://www.youtube.com/watch?v=wDBM6wVEO70,他们非常清楚地解释了列表视图的工作原理。

答案 1 :(得分:0)

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

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

查看通胀涉及解析XML。并且是一项昂贵的操作。这就是为什么API允许您重用组件。这是UI开发的常见模式。

这就是为什么你在第一次调用时有空,后来在视图的实例上有空。