我在Android中使用Android -support-v7-gridlayout模拟一个基于tile的地图。
我在调试期间平稳而快速地实现它,直到我在一个巨大的数据规模上测试它。实际数据大约是~700x400 (行-列),我刚刚在400x100中测试了它,但是应用程序刚刚崩溃并抛出OutOfMemoryException
。然后我减少数据,直到它实际运行在300x100上。它没有延迟或者我没有任何CPU性能问题,唯一的问题是内存不足。
这是我在网格布局中添加ImageView
的方法:
public boolean genMap(GridLayout gl) {
gl.removeAllViews();
gl.setRowCount( mapFile.getRowCount() );
gl.setColumnCount( mapFile.getColCount() );
try {
for (int row = 0; row < mapFile.getRowCount(); ++row) {
for (int col = 0; col < mapFile.getColCount(); ++col) {
com.gridlayout.GridLayout.Spec rowspan = GridLayout.spec(row, 1);
com.gridlayout.GridLayout.Spec colspan = GridLayout.spec(col, 1);
GridLayout.LayoutParams lp = new GridLayout.LayoutParams(rowspan, colspan);
lp.width = Cell.SIZE;
lp.height = Cell.SIZE;
Cell cell = genNewCell( ctx.getApplicationContext(), row, col );
gl.addView( cell, lp );
}
}
return true;
} catch (Exception e) {
return false;
}
}
其中Cell
是ImageView的子类
也许,我也想到了懒惰加载模式,其中唯一可见的视图将被加载出来,但是,我想知道GridLayout
是否已经实现了它。
更新1
GridView
似乎不是我要找的。它不能对角线滚动,也不能同时有水平和垂直的滚动条。我想要实现的是类似于GoogleMaps的ViewGroup布局,其中您可以以二维方式滚动,每个单元格内存分配/回收自动管理。我认为GridLayout
是我最后的希望,因为我看不到任何ViewGroup w/c实现我想要的。
所以我的问题是,我如何能够回收那些单元格,在屏幕上不可见,同时保持布局,因为他们是存在的?
GridLayout不做任何动态内存管理,只是简单地创建一切,无论它是否实际上在屏幕上。你需要使用GridView之类的东西。使用GridView,理论上可以支持无限数量的项目。因为你想做水平滚动,你需要一个自定义GridView实现。比如https://github.com/jess-anders/two-way-gridview.
如果你没有从我的文章中得到什么,不要用网格布局这样做。你可以测试一整天,但每个手机都不一样,有些手机的内存或多或少。
编辑1:随着android L中新RecyclerView的发布,这也可能更容易,但我还没有研究那么多。
在我看来,你应该使用Webview。已经解决了滚动,缩放,内存问题。