如何在安卓中缓存视图?

7
我正在构建一个动态生成标签和视图的应用程序。 我在xml布局中定义了我的“自定义视图”的外观,然后从代码中填充此布局。
由于填充的布局将始终相同,因此我希望只进行一次此操作。 在获得布局之后,我想将其缓存并在下一次需要时使用它。
问题是,如果我将我的充气布局放入缓存(例如哈希映射)并将其添加到父布局中,则下次再次尝试添加它时(这次我将从缓存中获取布局),系统会说我的布局已有一个父级。
您是否知道任何方法可以将子视图从父级分离,而不删除子视图?
以下是一些代码:
    private static HashMap<String, LinearLayout> mComponentsCache;

// inflate and add the layout in cache
layout = (LinearLayout)mLf.inflate(R.layout.form_textbox, mHolder, false);
mComponentsCache.put(FormFieldType.TYPE_TEXT, layout);

你是如何缓存布局的,为什么要这样做? - DroidBender
2
我想以这种方式做,因为重新填充已经填充过的相同视图没有意义。例如,我必须展示5个文本框,它们具有相同的布局但不同的内容。 - Ungureanu Liviu
1个回答

12

你实际上不能这样做。我引用了你的评论

我希望以这种方式完成,因为重新膨胀已经膨胀过的相同布局是没有意义的。例如,我必须展示5个具有相同布局但不同内容的文本框。

由于您需要5个不同的文本框实例,则必须每次都重新膨胀。如果您不想膨胀,则应找到一种复制已创建的布局的方法,但这也将不利于改进,因为复制也是“昂贵”的。

实际上,为了明确,膨胀视图并不需要XML解析(以防您这么认为),它是编译后的代码,因此实现创建视图副本的方法没有意义。

底线:坚持使用膨胀。


谢谢。我会坚持使用通货膨胀 :) - Ungureanu Liviu
事实上,为了明确一点,扩展视图并不经过XML解析(以防你这样认为),它是编译代码。解决了我之前的疑惑,谢谢 :-) - Nitin Bansal
如果是这种情况,那么listview行的缓存是如何工作的呢?似乎我们能够在其中重用视图,它是如何实现的? - Justin
1
@Justin listviews 重用视图:true。然而,屏幕上显示的视图在任何给定时间都是不同的实例。一旦一个视图离开屏幕,listview 就会重用它。 - Sherif elKhatib
@Justin:它的工作原理就像自动扶梯一样。当一个视图从顶部滚动出去时,它会被“回收”并成为下一个要滚动到底部的项目。如果屏幕上有8行,则列表通常同时具有9-10个行视图,而不管数据中的总项目数是多少。 - Mooing Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接