0
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null){
    convertView = ContactViewActivity.this.getLayoutInflater().inflate(R.layout.contact_view_field_row,
    parent, false);
}

String value = (String)getItem(position);

TextView fieldValue = (TextView)convertView.findViewById(R.id.contact_view_row_value);
fieldValue.setText(value);

return convertView;
}

上面的代码取自 BaseAdapter 类。那么将膨胀视图设置为 convertView 有什么意义呢?getView 的全部意义在于如果没有视图,则创建一个视图,给它属性,然后返回它,以便它可以在 ListView 的应用程序中显示,对吗?那么为什么不直接说 findViewById(R.id.contact_view_row_value); 呢?我的意思是我们到底在用 layoutInflater 做什么?我认为既然我们将它设置为等于 convertView,就不需要键入 convertView.findViewById。我的意思是它已经等于一个膨胀的 XML 文件,对吧?我在这里很困惑,我真的很感激一些澄清。

4

1 回答 1

1

因为convertView是可以重用的东西,尽管在运行时你不知道你是否被提供了一个现有View的数据必须更新,或者是否View需要膨胀一个新的。

当您的应用程序启动时,您需要inflateViews的才能让任何数据都显示在您的应用程序ListView中。Inflate意味着将资源 XML 解析为图形对象,并提供给 Android 的Context,因此它成为有可能在图形层次结构上呈现和交互的东西。稍后在应用程序中,Android 会尝试通过向您传递View之前已膨胀的 a 来帮助您节省资源并避免不必要的膨胀;这就是我们检查是否convertView不等于的原因null。如果不是,您可以现有的内容View转换为显示与当前索引相关的数据的内容。

但是,值得注意的ListView是,现在已弃用。尝试RecyclerView改用,这种行为更明显。这是一个例子

于 2017-05-18T05:33:20.127 回答