【问题标题】:How to display 40+ buttons programmatically如何以编程方式显示 40 多个按钮
【发布时间】:2021-03-19 13:16:45
【问题描述】:

我正在为一位朋友构建一个小型销售点应用程序。她需要一个平板电脑上的应用程序,它有 40 个添加按钮(和 40 个删除按钮)。每个按钮代表一个产品并具有不同的标签。 屏幕左侧应该有 20 个堆叠的垂直按钮,右侧也应该有 20 个堆叠的垂直按钮。所有按钮都应适合一个屏幕。

我尝试使用两个相邻的 recyclerviews - 固定到屏幕大小 - 每个 recyclerview 内具有相同的适配器和自定义视图,但这导致了很多延迟,并且我在模拟器中收到了帧被跳过的警告。我认为这是因为 recyclerview 中的大量视图(80 多个按钮)。

然后我在 1 条水平线上尝试了 1 个 recyclerview 和两个产品,但这似乎并没有提高性能并且使我的应用程序变得复杂(因为我需要每行设置两个产品)。 我也尝试过使用 ListView,因为我认为它的开销较小,但总是出现延迟和“I/Choreographer:跳过 44 帧!应用程序可能在其主线程上做了太多工作。”

似乎没有跳过任何帧的唯一方法是对 80 个按钮进行硬编码,但这不是最佳解决方案,因为产品的数量会随着时间而变化。当产品更改(保存在 csv 中)时,按钮的数量也应该更新,而无需更改代码。

有没有一种方法可以创建一个对系统要求不高的具有 80 个按钮的视图?理想情况下,我会在 1 个视图中输入 1 个产品列表。

1 个产品的示例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingHorizontal="10dip"
    android:paddingTop="1dp"
    android:paddingBottom="4dp">

    <Button
        android:id="@+id/add_button"
        android:layout_width="200dp"
        android:layout_height="44dp"
        android:minHeight="1dip"
        android:text="BUT L"
        android:textSize="22sp" />

    <TextView
        android:id="@+id/amount"
        android:layout_width="80dp"
        android:layout_height="44dp"
        android:paddingHorizontal="20dip"
        android:layout_gravity="center"
        android:textAlignment="center"
        android:text="0"
        android:textSize="22sp" />

    <Button
        android:id="@+id/delete_button"
        android:layout_width="60dp"
        android:layout_height="44dp"
        android:minWidth="1dip"
        android:minHeight="1dip"
        android:text="-"
        android:textSize="22sp" />

</LinearLayout>

【问题讨论】:

  • 你试过用可点击的标签代替按钮吗?也许绘制按钮的强度较低。发布一小段代码来重现该问题也将有所帮助,因为这将使其更容易重现,并且您更有可能更快地获得答案

标签: android kotlin pos


【解决方案1】:

我个人不会担心日志中的跳帧消息 - 这更多地与您的模拟器在您的机器上的运行方式有关,如果发生垃圾收集,系统和其他应用程序还发生了什么。 ..

RecyclerViews 是执行此操作的正确方法 - 它们旨在提高效率!旧的 ListView 方法会创建您的 40 个条目,并使用它们自己的 Button 视图 - RecyclerViews 只创建几个(足以填满屏幕和两侧,以便他们可以在您滚动时窥视)。

然后他们回收它们,方法是获取滚动到屏幕外的ViewHolder,并用即将滚动到视图中的项目的数据填充它(这就是 onBindViewHolder 方法是关于,填写该数据)。因此,您只有少数 ViewHolders 及其视图布局,您的列表代表 40 个项目还是 40,000 个并不重要!


确实,您应该在真实设备上分析性能,但基本RecyclerView 布局不应该有任何问题,这在UI 方面几乎没有任何问题。如果您愿意,您可以发布您的 AdapterViewHolder 代码,人们可以告诉您在实际处理逻辑中您是否正在做任何超慢或内存密集型的事情。

还要确保为您创建的每个ViewHolder 查找UI 元素一次,并将它们存储为您可以在onBindViewHolder 中设置的属性。如果您在onBindViewHolder 中运行findViewById(请记住,每次项目准备好滚动到视图中时运行),这是很多重复的工作。在这种情况下可能不会出现故障,但如果可以的话,最好还是避免它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多