当许多TableLayout在内存中时,ListView会变慢

时间:2014-05-05 14:24:01

标签: android listview android-fragments android-listview android-tablelayout

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

表A |表B

表C |表D

视图效果很好,即使内存中有20多个表,它也非常流畅。

但是,UI的其他部分(据我所知,只有ListViews,但我可能错了)变得不稳定/慢。表格视图仍然非常流畅。 ListViews使用Holder模式重复使用视图,并在Table不存在时正常工作。

我注意到的一件事是,当我从活动A切换活动时(表格所在的位置) - >活动B,NavigationDrawer的ListView再次变得平滑,这让我相信不是内存问题,而是绘图问题

这就是活动A的结构:

  1. GridLayout的
    • FrameLayout(里面有片段)
  2. 一次只显示一个片段。如果一次只显示一个片段,为什么在内存中有多个片段会影响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上也看不到缓慢的行为。

0 个答案:

没有答案