Android 上不同儿童的 ScrollView 与 RecyclerView
ScrollView vs RecyclerView for dissimilar children on Android
我混合了 10-15 个自定义视图和要在垂直列表中显示的片段。我不确定 RecyclerView 在所有视图都不相似的场景中是否有任何优势。 RecyclerView 似乎添加了很多样板代码,我认为我可以获得的唯一优势是更简单的 enter/exit 动画。
我的自定义 views/fragment 也会在创建时进行网络服务调用。出于商业原因,我们不会缓存网络请求。我的理解是 RecyclerView 会在每次绑定时触发这些 Web 服务调用,从而导致冗余调用和可见的延迟。相比之下,ScrollView应该加载一次视图,并将它们全部保存在内存中,避免多次调用。
我的理解对吗?在给定的场景中,我需要一些帮助来理解 ScrollViews 的性能影响。
首先,您必须决定您使用的是 View
或 Fragment
或两者。不要比较 View
和 Fragment
对这两者有一个普遍的误解,它们并不相似,实际上 Fragment
在架构和方面接近 Activity
实施。
其次,你能不能重复使用其中的一些View
/Fragment
,如果可以,那么RecycleView
可以帮助你很多。
在您决定以上主题后:
My understanding is that RecyclerView would trigger these web-service
calls on each binding
不,这不是真的,每当显示新项目(重复使用或新创建)时都会调用绑定方法,您可以实现适配器以在项目上仅执行一次 web API,这是你的选择。
只要有可能,我总是选择 RecycleView/ListView
,它有助于减少内存占用并减少实现。在某些情况下,视图上没有大量内存使用并且我无法重用某些实现,那么我会选择 ScrollView
,但在实现之前我会三思而后行。
ScrollView
对于 ScrollView
,它的所有子视图都将立即创建,无论在屏幕上是否可见。如果您的解决方案使用 ScrollView,您可能希望 "listen" 在其子视图变得可见时更新其内容,最初使用占位符。您还可以构建一些可以在后台线程中获取内容的东西。这可能会很快变得比您想要的更复杂。
RecyclerView
A RecyclerView
提供了延迟创建 child 视图的优势,直到它们自动可见,并且可以 re-use child 具有通用布局的视图。
通过为每个 children 使用不同的 "item view types",您将禁用 RecyclerView 的 "recycling" 部分,但仍然可以获得延迟创建视图的好处,直到它们被滚动到视图中。
RecyclerViews 确实提供了一个相当结构化的模式,供您通过 Adapter 和 ViewHolders 使用。虽然个人并不熟悉,但 RecyclerView 也有一个 RecyclerView.ViewCacheExtension
旨在让开发人员控制视图的缓存。
总的来说,后期绑定的优势(不要创建和加载可能永远不会被查看的视图)和 RecyclerView 的灵活性可能会给您带来不错的效果。
我混合了 10-15 个自定义视图和要在垂直列表中显示的片段。我不确定 RecyclerView 在所有视图都不相似的场景中是否有任何优势。 RecyclerView 似乎添加了很多样板代码,我认为我可以获得的唯一优势是更简单的 enter/exit 动画。
我的自定义 views/fragment 也会在创建时进行网络服务调用。出于商业原因,我们不会缓存网络请求。我的理解是 RecyclerView 会在每次绑定时触发这些 Web 服务调用,从而导致冗余调用和可见的延迟。相比之下,ScrollView应该加载一次视图,并将它们全部保存在内存中,避免多次调用。
我的理解对吗?在给定的场景中,我需要一些帮助来理解 ScrollViews 的性能影响。
首先,您必须决定您使用的是 View
或 Fragment
或两者。不要比较 View
和 Fragment
对这两者有一个普遍的误解,它们并不相似,实际上 Fragment
在架构和方面接近 Activity
实施。
其次,你能不能重复使用其中的一些View
/Fragment
,如果可以,那么RecycleView
可以帮助你很多。
在您决定以上主题后:
My understanding is that RecyclerView would trigger these web-service calls on each binding
不,这不是真的,每当显示新项目(重复使用或新创建)时都会调用绑定方法,您可以实现适配器以在项目上仅执行一次 web API,这是你的选择。
只要有可能,我总是选择 RecycleView/ListView
,它有助于减少内存占用并减少实现。在某些情况下,视图上没有大量内存使用并且我无法重用某些实现,那么我会选择 ScrollView
,但在实现之前我会三思而后行。
ScrollView
对于 ScrollView
,它的所有子视图都将立即创建,无论在屏幕上是否可见。如果您的解决方案使用 ScrollView,您可能希望 "listen" 在其子视图变得可见时更新其内容,最初使用占位符。您还可以构建一些可以在后台线程中获取内容的东西。这可能会很快变得比您想要的更复杂。
RecyclerView
A RecyclerView
提供了延迟创建 child 视图的优势,直到它们自动可见,并且可以 re-use child 具有通用布局的视图。
通过为每个 children 使用不同的 "item view types",您将禁用 RecyclerView 的 "recycling" 部分,但仍然可以获得延迟创建视图的好处,直到它们被滚动到视图中。
RecyclerViews 确实提供了一个相当结构化的模式,供您通过 Adapter 和 ViewHolders 使用。虽然个人并不熟悉,但 RecyclerView 也有一个 RecyclerView.ViewCacheExtension
旨在让开发人员控制视图的缓存。
总的来说,后期绑定的优势(不要创建和加载可能永远不会被查看的视图)和 RecyclerView 的灵活性可能会给您带来不错的效果。