【问题标题】:recycling views in scroll view在滚动视图中回收视图
【发布时间】:2013-05-06 17:59:29
【问题描述】:

我有一个应用程序可以显示频道列表的电视指南。我的 UI 由许多显示电视节目的不同宽度的自定义视图组成,所有这些自定义视图都添加到水平滚动视图中,水平滚动视图添加到滚动视图中,因此我的视图可以在左右和顶部二维滚动向下。这一切都很好,直到我添加了很多视图并且它开始非常慢。所以我需要一种方法来回收像listiew在滚动视图中所做的视图,也许有一个定制的滚动视图可以做到这一点,或者有人知道如何做到这一点,奇怪的是滚动视图没有像gridview和listview这样的适配器支持。

【问题讨论】:

  • 一点都不奇怪。 ScrollViews 滚动...为什么它们应该由适配器支持?如果您想要一个与Adapter 一起使用的视图,那么您应该查看AdapterView 及其子类。事实上,从听起来你可能需要创建自己的自定义AdapterView
  • 创建一个自定义的AdapterView听起来像是开销,也许有更简单的解决方案
  • 我最近做了这样的事情,就像你说的,性能很糟糕。一旦我完成了这个项目,我就想到如果WebView 显示一个本地 HTML 文件,我可以得到相同的结果。如果您希望每个程序都可点击,这对于您的应用程序可能不够复杂,但我想我还是会提到它。顺便说一句,我应该说我从未实施过这种方法,因此未经测试。
  • 你能解释一下在滚动视图中添加的视图
  • 在我看来,您可以改用 ListView,并且 ListView 中的每个项目都可以是您指南中的一行。虽然回收这些东西并不容易,但可能值得一试。

标签: android view scrollview adapter


【解决方案1】:

我做了类似的事情,只是我的视图没有像你的那样连接,但它们的大小都不同。

首先,您需要定义您的整个区域(不仅仅是查看屏幕)是否具有确定的或动态数量的自定义视图。

如果您有确定数量的视图及其位置,您应该使用 Rect 列表创建它们的位置图(无论 xy 点是否属于,Rect 都有很好的功能)。然后,您定义屏幕上可见的最大视图。为了在没有持续加载的情况下工作,您应该拥有最大的可见视图 + 总对象的至少一行边框视图。毕竟,您应该很容易拥有自己的定位系统,您可以在其中加载屏幕范围内的视图+一些开销(这样做的目的是您希望您的用户在至少滚动一段时间时平滑过渡),如果您需要在卸载的同时加载一些(读取重用/不要处理对象并在 onScroll 事件中创建它们)并根据需要放置它们。

如果您想确定哪些视图应该可见,您只需浏览列表并询问 Views Rect 是否与您要加载的区域的 Rect 相交。

希望这张图片能多一点帮助

我知道这听起来有点令人困惑且难以实施,但您没有问一个简单的问题 :) 希望这对您有所帮助并享受您的工作。

【讨论】:

  • 很棒的答案。如果您可以共享代码,您是否有机会实现此功能?
  • 已经使用的代码的问题是它会让你感到困惑,并且很可能会让你远离解决方案。如果您有任何具体问题,请随时通过我的电子邮件向我发送消息。这是一个不基于代码的逻辑问题。
  • @MarkoLazić 删除左侧视图时如何解决滚动位置问题?
【解决方案2】:

由适配器备份并回收视图的 ScrollView 是 ListView,顶部有几个额外的可选功能。

也许您想要一个由适配器支持的 Horizo​​ntalScrollView?搜索 Horizo​​ntalListView 会给你一些结果,例如:https://github.com/dinocore1/DevsmartLib-Android

【讨论】:

  • 我不能在我的情况下使用列表视图,我尝试了horizo​​ntalListView,问题是我需要多行,所以我使用了多个horizo​​ntalListView,但是当滚动1行时我需要它们全部同时滚动,我更改了 Horizo​​ntalListView 类,因此它将滚动事件与距离发送到剩余的列表视图,但它们落后于第一个滚动的列表视图
  • 为什么不能使用 ListView?消耗所有触摸事件并滚动其子级的 ListView 将起作用。只需要在每行被回收时重新填充并重置滚动位置,并且
  • 它可以工作,但是速度很慢,并且剩余的行落后于滚动的第一行,第二个我有 20 个水平行,20 个 Horizo​​ntalListViews 会比滚动视图更慢地降低任何手机的速度现在有
  • 6-10 取决于屏幕尺寸,共 20 个
  • 您的性能问题来自视图层次结构中的所有 20 行和所有列,如果正确实现 ListView 和 Horizo​​ntalListView,您将只加载 6-10 行和 x-y 列一次。当然,如果每个单元格本身都是一个复杂的布局,这可能仍然很慢,但是您应该能够对其进行优化