在android应用程序中,我正在以表格(固定标题/列,动态内容)的形式处理大量数据,必须呈现给用户。用户应该能够垂直滚动以及水平滚动以查看更多数据。这些表格是使用自定义RelativeLayout 视图以及四个TableLayouts 为数据实现的。
表A |表B
表C |表D
视图效果很好,即使内存中有20多个表,它也非常流畅。
但是,UI的其他部分(据我所知,只有ListViews,但我可能错了)变得不稳定/慢。表格视图仍然非常流畅。 ListViews使用Holder模式重复使用视图,并在Table不存在时正常工作。
我注意到的一件事是,当我从活动A切换活动时(表格所在的位置) - >活动B,NavigationDrawer的ListView再次变得平滑,这让我相信不是内存问题,而是绘图问题。
这就是活动A的结构:
一次只显示一个片段。如果一次只显示一个片段,为什么在内存中有多个片段会影响ListViews的性能?
我不知所措!非常感谢任何帮助。
更新:以下是创建布局和片段的代码...
/**
* <b>Purpose:</b> Creates a dashlet.
*
* @param map
* @return
*/
private FrameLayout createDashlet(final Map<String, Object> map)
{
final String guid = SettingsManager.getValueFromMap(
SettingsManagerKeyEnum.GUID, map
);
final Integer viewType = Integer.parseInt((String) SettingsManager
.getValueFromMap(SettingsManagerKeyEnum.VIEW_TYPE, map, "0")
);
final String className = SettingsManager.getValueFromMap(
SettingsManagerKeyEnum.CLASS_NAME, map
);
DashletViewId dashletViewId = DashletViewId.getInstance();
int index = dashletViewId.getUniqueId(map);
// Look for to see if the dashlet already exists.
FrameLayout dashletLayout = (FrameLayout) dashboardGridLayout.findViewById(index);
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
// Look to see if the dashlet fragment exists in memory.
DashletFragmentNEW findFragment = (DashletFragmentNEW) manager.findFragmentById(index);
Boolean shouldAddFragments = false;
// if there is currently no dashlet layout, create one
if (dashletLayout == null)
{
dashletLayout = createDashletLayout(guid, index, viewType);
// checks to see if it should immediately add the dashlet fragment
if (dashboardGridLayout.getChildCount() == 0)
{
shouldAddFragments = true;
}
}
if (findFragment == null && className != null)
{
DashletFragmentType dashletFragmentType = DashletType.getDashletFragmentType(className);
switch (dashletFragmentType)
{
case TABLE_FIXED_HEADERS:
findFragment = DashletTableFragmentNEW.newInstance();
break;
case LIST:
findFragment = DashletListFragmentNEW.newInstance();
break;
case UNKNOWN:
Log.e(TAG, "UNKNOWN FRAGMENT");
break;
}
shouldAddFragments = true;
}
if (findFragment != null && shouldAddFragments) {
transaction.add(index, findFragment, guid);
transaction.commit();
findFragment.setDashletAllDashletMap(map);
findFragment.setDashletType(DashletType.fromDashletClassName(className));
findFragment.setListener(this);
}
return dashletLayout;
}
有一个观察者通知每个片段是否应该显示或隐藏,调用:
@Override
public void hideFragment(Fragment fragment) {
FragmentManager manager = getFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.hide(fragment);
ft.commit();
}
@Override
public void showFragment(Fragment fragment) {
FragmentManager manager = getFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.show(fragment);
ft.commit();
}
更新2:三星Note 10.1(2012)上没有缓慢,但它仍然存在于Nexus 5. Note 10.1具有较弱的CPU和与Nexus 5相同的RAM量(2 GB)
更新3:三星Galaxy Tab 2 7.0 GT-P3113也没有出现任何减速迹象。 更新4:在Moto X上也看不到缓慢的行为。