Android 当内存中有许多表布局时,列表视图会变慢

Android 当内存中有许多表布局时,列表视图会变慢,android,listview,android-fragments,android-listview,android-tablelayout,Android,Listview,Android Fragments,Android Listview,Android Tablelayout,在android应用程序中,我正在处理大量固定标题/列表格形式的数据,动态内容必须呈现给用户。用户应该能够垂直和水平滚动以查看更多数据。这些表是使用一个定制的RelativeLayout视图实现的,该视图有四个数据表布局 表A |表B 表C |表D 视图工作得很好,即使内存中有20多个表,也非常平滑 但是,据我所知,UI的其他部分只显示ListView,但我可能错了,它会变得不稳定/缓慢。桌面视图仍然非常平滑。ListViews使用Holder模式重新使用视图,并在表不存在时正常工作 我注意到的

在android应用程序中,我正在处理大量固定标题/列表格形式的数据,动态内容必须呈现给用户。用户应该能够垂直和水平滚动以查看更多数据。这些表是使用一个定制的RelativeLayout视图实现的,该视图有四个数据表布局

表A |表B

表C |表D

视图工作得很好,即使内存中有20多个表,也非常平滑

但是,据我所知,UI的其他部分只显示ListView,但我可能错了,它会变得不稳定/缓慢。桌面视图仍然非常平滑。ListViews使用Holder模式重新使用视图,并在表不存在时正常工作

我注意到的一件事是,当我将活动从活动A切换到活动B时,NavigationDrawer的列表视图再次变得平滑,这使我相信这不是内存问题,而是绘图问题

这就是活动A的结构:

网格布局 FrameLayout内部有一个片段 一次只显示一个片段。如果一次只显示一个片段,为什么内存中有多个片段会影响ListView的性能

我不知所措!非常感谢您的帮助

更新:下面是创建布局和片段的代码

/**
 * <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;

}
更新2:2012年三星Note 10.1上没有出现这种速度缓慢的情况,但Nexus 5上仍然存在这种情况。注10.1具有较弱的CPU和与Nexus 5 2 GBs相同数量的RAM

更新3:三星Galaxy Tab 2 7.0 GT-P3113也没有显示任何减速迹象。
更新4:在Moto X上也看不到这种缓慢的行为

您应该发布列表项的实际XML布局以及用于膨胀和显示视图的代码我已经添加了为每个布局创建布局和片段的代码。。。不确定这是否有用
@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();
}