现在我真的很困惑要学习哪一个。我是iPhone应用程序开发人员,现在正在学习Android开发。
我已经学习了如何使用ListView
将Adapter
与静态字符串数组一起使用。我习惯在iPhone中使用自定义单元,主要用于显示TableView
中的动态内容,例如图像和文本。
那么在Android中这样做的方法是什么呢? TableLayout
或ListView
吗?
最佳答案
正如其他人在评论中已经说过的那样,您需要先明确定义要执行的操作,然后再具体决定要使用哪种布局类型。但是,我当然可以理解尝试确定要使用哪种布局类而引起的困惑,因为通常有多种选择可以实现相同的目标。例如,要创建垂直滚动的项目列表,可以首先选择一个垂直的LinearLayout
,然后将其放置在ScrollView
内。但是,另一方面,要获得相似的最终结果,可以将ListView
与合适的Adapter
一起使用。
同样,要显示可以垂直滚动的项目网格,可以在TableLayout
内使用ScrollView
。或者,通过再次使用适当的GridView
提供数据,可以通过使用Adapter
获得类似的结果。
现在,第一个主要区别是:LinearLayout
和TableLayout
之类的类要求您以XML布局或以编程方式以代码形式提供子元素。诸如ListView
和GridView
(以及其他几种)之类的类非常不同,因为它们是android.widget.AdapterView
的子类。关于AdapterView
类的特殊之处在于,使用Adapter
将数据绑定(bind)到它们。因此,回到垂直项目列表的示例,如果您要基于一组数组数据在LinearLayout
中显示一组子列表项目,则必须基于以下内容以编程方式创建子View
并将其添加到该LinearLayout
中数组数据。另一方面,对于ListView
,代表子项的各个View
是从合适的Adapter
提供的。因此,与其以编程方式不使用所有子项填充布局(例如LinearLayout
或TableLayout
就是这种情况),而是基于Adapter
的布局调用Adapter
并在需要它们时调用子View
s。
最后一点是我相信您应该了解的基于Adapter
的布局的下一个关键区别:在许多数据滚动到 View 之外的情况下,它们在显示大量数据时效率更高。例如,与仅将所有项目填充到ListView
并将其放入LinearLayout
内相比,ScrollView
可以用于显示较大的项目滚动列表,效率更高。这种效率的原因是,基于AdapterView
的布局通常不会一次包含所有子View
。而是,当用户滚动列表时,现有的 subview 由Adapter
“回收”或“转换”以显示下一个子元素。用一个例子来说明这一点:您需要一个垂直滚动列表,其中包含100个项目。但是,屏幕可能仅足够大到可以一次显示7。假设您在LinearLayout
中使用ScrollView
显示100个列表项。这意味着LinearLayout
容器具有100个子Views
。这些子项始终存在于布局中,并且即使一次只能在屏幕上看到七个,也需要在滚动事件期间由系统进行处理。这会花费额外的CPU时间,大量的RAM,并且滚动可能会变慢。现在,使用ListView
,布局可能仅包含7或8个子View
。随着用户滚动,这些子View
会通过Adapter
动态转换或重新实例化,您可以通过Adapter
绑定(bind)数据。用户将体验到更快,更流畅的滚动操作。从编程的角度来看,通过Bitmap
绑定(bind)数据列表通常要优雅得多。当您处理Android
的滚动列表或网格时,AdapterView
设备的内存限制也意味着Bitmap
的使用非常重要。
请记住,在回答此问题时,我已经假设您正在尝试显示可滚动项目的垂直或表格列表,也许包括LinearLayout
,并且我专注于您所使用的布局类型d用于实现该数据的布局和滚动。布局类(例如TableLayout
,Adapter
等)是重要的类,您将一直使用它们为应用程序形成单独的布局构建块。如果保证您的整个列表都适合屏幕且不会滚动,那么使用TableLayout
的额外复杂性(并不是说它真的那么复杂)可能没有意义,然后您可能只想使用ojit_code或其他任何方法。