2016-08-26 66 views
3

我已阅读了一些文章,并观看了video以了解ListView的工作原理。所以,假设我有5个项目的列表(所有项目都可以在屏幕上看到)。我在我的自定义适配器下面的代码从BaseAdapter继承:android getView()如何在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位置。看完后,我认为我有null前5个电话(直到所有可见的项目视图未初始化)。为什么只有第一个?我错过了什么?

+0

是否可以发布您的list_view_item代码 – Ashish

+0

在我的环境中,视图全为空。你能发布完整的布局和适配器代码吗? – nshmura

回答

0

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

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

查看通胀涉及解析XML。而且成本很高。这就是为什么API允许你重用组件。这是UI开发中的常见模式。

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

1

ListView回收视图,所以第一次运行它将是null因为你必须膨胀视图。一旦你膨胀视图,你应该重新使用相同的视图,只是更新内容,以提高性能。我会推荐观看以下视频https://www.youtube.com/watch?v=wDBM6wVEO70,他们很好地解释了列表视图是如何工作的。

+0

此视频非常有用。但是我没有找到答案,getView()是如何工作的(当它被调用的时候和频率)。我从中得到的所有信息:'getView()'是根据一些内部回收算法调用的,但没有任何说明它是如何工作的。我知道它可能会改变,但我想知道至少一些近似的模式。 – Natasha

+0

那么getView()将被调用,每个视图在屏幕上可见。您可以添加一个断点并查看该行为。我建议去源代码,以确切了解回收算法的工作原理。 –

相关问题