为啥在列表视图中使用 Inflater

Posted

技术标签:

【中文标题】为啥在列表视图中使用 Inflater【英文标题】:Why to use Inflater in listview为什么在列表视图中使用 Inflater 【发布时间】:2013-08-04 01:36:43 【问题描述】: 我一直对为什么我们需要在 android 中使用 inflater 有歧义,为什么在 ListView 中使用它们来进行自定义布局(如下所示)? 什么是充气机? 使用 Inflater 有什么好处?
public class MobileArrayAdapter extends ArrayAdapter<String> 
    private final Context context;
    private final String[] values;


public MobileArrayAdapter(Context context, String[] values) 
    super(context, R.layout.list_mobile, values);
    this.context = context;
    this.values = values;


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater.inflate(R.layout.list_mobile, parent, false);
    TextView textView = (TextView) rowView.findViewById(R.id.label);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.logo);
    textView.setText(values[position]);

谢谢,

【问题讨论】:

【参考方案1】:

什么是充气机?

总结一下LayoutInflater Documentation 所说的...LayoutInflater 是Android 系统服务之一,它负责获取定义布局的XML 文件,并将它们转换为View 对象。操作系统然后使用这些视图对象来绘制屏幕。

我一直对为什么我们需要在 android 中使用 inflater 有歧义,为什么 它们是否在 android ListView 中用于自定义布局?

通常,您不需要直接使用 LayoutInflater。当您在 Activity 的 onCreate() 方法中调用 setContentView() 时,Android 会为您完成大部分布局膨胀。 因此,作为程序员,您有责任确保视图被夸大。现在您想在 ListView 的上下文中扩展视图。如果您不想自定义每个项目,Adapter 类可以为您完成膨胀。但是,如果您想自定义列表中显示的视图,则必须使用 LayoutInflater 手动为每个视图充气,因为您无法使用其他现有方法。

使用 Inflater 有什么好处?

使用它没有任何好处。您需要使用某种形状或形式的 LayoutInflater 来扩充您的静态 XML 布局。

或者,您可以使用 java 代码动态创建视图。但是,您需要调用方法来手动设置视图的每个属性。在我看来,使用 XML/inflation 过程更容易。此外,Android 会在构建时对您的 XML 文件进行预处理,从而加快执行时间。

【讨论】:

“没有优势。你需要通过某种方式夸大你的视图”这句话显然是错误的,你总是可以在代码中创建视图 问题“使用 Inflater 有什么好处?”对我来说,“使用 Inflater 与在代码中创建视图有什么优势?”。如果回答“扩展”问题,您的回答“使用它没有任何优势 [...]”将是错误的。 那是你的解释。在我看来,OP 不知道什么是充气机。所以他/她可能想知道是否有 xml 布局渲染的替代方案。毕竟,这就是他的代码示例所做的一切。 Joel .... 您的回答澄清了我的问题 .... 除了使用充气机之外,还有其他 xml 布局渲染的替代方法吗? @sky 你也可以使用 java 为 android 创建视图对象,但我不建议这样做。查看我的编辑。【参考方案2】:

我一直对为什么我们需要在 android 中使用 inflater 有歧义,为什么在 android ListView 中使用它们来进行自定义布局? 它们用于为每一行创建视图。

什么是充气机? 从 XML 布局创建视图的系统服务。

在下面的代码中,我试图了解为什么要使用 Inflator? 充气器用于为行创建视图。

使用 Inflater 有什么好处? 相比什么?您想如何从 XML 布局中创建视图?

【讨论】:

所以只有使用 Inflator 才能为 Listview 的行创建视图? 要么使用来自 XML 布局的充气器,要么以编程方式使用 new View()。在大多数情况下,您可能希望使用 XML 布局。【参考方案3】:

简单地说,inflater 允许您从资源布局文件创建视图,因此您无需以编程方式创建所有内容。

在您的示例中,您膨胀了布局R.layout.list_mobile。这使您可以访问其中的所有视图。例如,您然后调用:

TextView textView = (TextView) rowView.findViewById(R.id.label);

通过调用rowView.findViewById(),您可以访问在该布局中创建的视图。通常对于 ListViews,您将拥有一个行 XML 文件,然后您将其膨胀并将数据放入视图中。

【讨论】:

以上是关于为啥在列表视图中使用 Inflater的主要内容,如果未能解决你的问题,请参考以下文章

创建列表视图后查看持有人警告

为啥单击 SwiftUI 中的列表项后列表视图项变为灰色?

进度可见性在列表视图页脚中不起作用

Flutter嵌套列表视图为啥我不能使用行?

为啥我不能在选择器视图列表中选择我的第一个数据?

为啥滚动时列表视图项目内的图像视图会消失?