【问题标题】:Can my layout be improved for efficiency?我的布局可以提高效率吗?
【发布时间】:2012-10-18 18:08:31
【问题描述】:

我有一个如下所示的布局。它被代码膨胀并添加到 Horizo​​ntalScrollView 中,有时数百次,并导致内存问题。

我想知道是否可以做些什么来提高效率?最初我使用 LinearLayouts,用 RelativeLayout 代替它对滚动产生了巨大的影响。现在我想知道它是否可以进一步改进?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="156dp"
    android:layout_height="254dp"
    android:paddingLeft="7dip"
    android:paddingRight="7dip">

    <FrameLayout android:id="@+id/button_frame"
    android:layout_width="156dp"
    android:layout_height="218dp">

    <ImageView android:id="@+id/button_bg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/image_bg"
        />

        <ImageView android:id="@+id/button_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="bottom|right"
        />

        <TextView android:id="@+id/button_select"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="2dip"
        android:layout_marginRight="2dip"
        android:background="@drawable/btn_selector_bg_selected"
        />

        <TextView android:id="@+id/button_selected"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginLeft="2dip"
        android:layout_marginRight="2dip"
        android:background="@drawable/title_bg_selected"/>

    </FrameLayout>

    <TextView
    android:id="@+id/button_title"
    android:layout_width="156dp"
    android:layout_height="36dp"
    android:textColor="#ffffff"
    android:singleLine="true"
    android:textSize="13sp"
    android:textStyle="bold"
    android:gravity="center_vertical|left"
    android:ellipsize="end"
    android:paddingLeft="30dip"
    android:paddingRight="5dip"
    android:layout_below="@id/button_frame"
    android:background="@drawable/title_bg"/>

</RelativeLayout>

ImageView button_image 是使用 AQuery 图像缓存填充的,所以我不确定我是否可以做更多的事情来改进图像的处理方式。但非常感谢任何有关改进的提示。

【问题讨论】:

  • 你试过使用merge吗?
  • 有趣,我不知道合并!除了以下建议的布局更改之外,我肯定会尝试一下。

标签: android performance android-layout


【解决方案1】:

一般来说,在 Android 中优化布局的一个好方法是尽量减少容器之间的嵌套数量。布局容器嵌套得越深,框架在测量、布局和处理视图层次结构事件方面必须做的工作就越多。

但我认为你可能问错了问题。

HorizontalScrollViewVerticalScollView 不适合您使用它们。它们旨在保持大部分静态布局,并在必要时允许它滚动,具体取决于它恰好运行的屏幕大小。

您想要一个重复的列表,其中包含大部分相同的视图,用户可以滚动。要使用的正确 Android 视图容器是 ListView,或 AdapterView 的其他后代之一。

ListView 只注意创建/膨胀必要的子视图以填充屏幕空间,并在用户滚动时重用它们。这解决了您遇到的内存问题。它通过要求您将其与 Adapter 配对来实现这一点 - 一个包装正在显示的实际数据的对象,并按需为给定数据项创建正确的视图。

由于您尝试进行水平滚动,您还可以查看Gallery(现在在 Android 中已弃用)或更新的 ViewPager 类,它们都支持通过大量数据列表进行水平移动。

【讨论】:

    【解决方案2】:

    如果您可以使用 ListView 而不是 Horizo​​ntalScrollView,您可以创建一个使用 viewHolder 模式的数组适配器,这实际上允许您在列表视图中重用每个项目的视图。看看这个了解更多细节:http://www.jmanzano.es/blog/?p=166

    【讨论】:

    • 谢谢,我可以横向使用吗?
    • 这是关于如何水平实现 ListView 的来源(如果答案上的链接仍然有效):stackoverflow.com/questions/3240331/…
    • 这是我尝试 google 时的 github 存储库:github.com/vieux/Android-Horizontal-ListView
    • 嗨。我已经使用上面的建议实现了 Horizo​​ntalListView。我需要将 onClick 侦听器添加到列表中的项目,因此尝试了 Xavi 的解决方案建议(上面链接的页面上的第 3 条评论)。这对我来说几乎是完美的,但奇怪的是,如果我尝试通过拖动其中一个项目来滚动视图,列表会在滚动之前跳转位置。不幸的是,我似乎无法就该问题发表评论以询问发生了什么问题。
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2012-06-18
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多