提高实例化和扩展ViewFlipper使用的视图的性能

时间:2018-04-12 11:16:55

标签: java android xml android-layout user-interface

我正在使用ViewFlipper显示应用程序所做的所有测量(1次测量= 1页元素)。问题是,如果有超过50个元素,则初始化/重新加载ViewFlipper内容的性能会变得非常糟糕。即,应用程序在启动后大约15秒没有响应。我做了一些记录并发现,超过70%的加载时间花在View.inflate(ctx, R.layout.view_measurement, null);

根据我的理解,inflate(...)会将布局xml文件解析为View,因此可以在Java中使用它。由于布局xml文件每次都是相同的,所以在我看来,对于每个元素一遍又一遍地执行相同的繁重工作。我尝试了许多改变这一点的事情,让这种情况只发生一次,遗憾的是没有成功。我也尝试在xml中使用和标记,但总是出错。

我知道有更好的方法而不是ViewFlipper来完成这项工作,但由于我赶时间其他一切正常,我想保留这个并找到一个快速的解决方案。

MainActivity.java

...

ViewFlipper viewFlipper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    viewFlipper = (ViewFlipper)super.findViewById(R.id.measurementsViewFlipper);

    int measurementsAmount = 100; //example

    for(i=0; i<measurementsAmount; i++){

        View measurementView = View.inflate(ctx, R.layout.view_measurement, null);

        ... fill the view ...

        viewFlipper.add(measurementView);

    }

    ...

}

view_measurement.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:gravity="center_vertical" 
    android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal">


    ...


</LinearLayout>
</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

减少xml通胀时间的唯一方法是减少xml布局中使用的视图数量。例如,只要查看您发布的布局,就可以(并且应该)删除根RelativeLayout,如果它只是包装LinearLayout。此外,使用ConstraintLayout可能允许您进一步删除ViewGroups并减少嵌套级别和视图计数。

但这仍然不行,因为真正的问题是你提前充斥了很多观点。在您的示例中,如果页面布局仅包含5个视图,则您将创建总共500个视图(100 x 5)。这就是很多,这就是为什么你需要一个视图循环机制,所以你不需要预先创建所有视图,只需要为当前页面创建一些视图。

如果您想要ViewFlipper的行为,Android SDK会有一个名为AdapterViewFlipper的组件,您应该使用它。它只需要一个额外的适配器类,您将传递测量数据,并在其中扩展测量布局。