是否存在使用View回收替换Gallery小部件?

Jos*_*arl 12 android view gallery out-of-memory recycle

Android上的默认Gallery小部件不会回收视图 - 每次调用新位置的视图时,小部件总是调用getView适配器的方法convertView设置为null.

当您向后和向前滚动时,这会在创建的大量视图中结束,Gallery中存储的回收器组件似乎不会足够快地回收它们导致OOM情况.

您可以使用一些大图像作为您的图库项目轻松测试,但只有TextView最终会导致它.在getView适配器的方法中放置带有计数器的日志语句,以查看创建了多少新视图.

是否存在行为类似Gallery但又实现视图回收的第三方窗口小部件?

Jos*_*arl 24

最后,我的解决方案是@ CommonsWare建议修改Gallery源代码.这也需要复制以下文件:

  • AdapterView
  • AbsSpinner

但这些都很简单.

之后我修改了代码来执行以下操作:

RecycleBin(AbsSpinner)

  • 将物体一个接一个地放在回收器中,而不是根据位置
  • 无论请求的位置如何,都从回收器的底部检索对象
  • 现有实现假设适配器中的每个不同位置都产生了唯一的视图.如果您的图库只包含一种类型的项目,则上述更改才有效,如果不是,您需要根据项目类型添加某种类型的密钥以及所需类型的数量

Gallery

  • 使用反射(ugh)修改私有mGroupFlags变量ViewGroup以允许子重新排序 - 我还设置了一个布尔值,指示在使用组件之前我测试的字段访问是否成功.
  • 删除了所有来电 mRecycler.clear()
  • 当(a)调用setSelection时(b)发生动画滚动时,图库在滚动时必须显示的项目数量会更改并且现有实现将清除回收器

通过这些修改,我newView在我的适配器中的方法中的计数器达到了... 7.

这是代码(放在公共领域2013/08/07 http://en.wikipedia.org/wiki/WTFPL下)

  • @Akos既然你问过,我将代码放在公共领域http://en.wikipedia.org/wiki/WTFPL下 (2认同)