Kivy - 回收布局



通常情况下,如果应用程序界面需要大量组件来显示数据项,其性能会下降。Kivy 中的 RecycleView 组件提供了一种灵活的替代方案。使用 RecycleView,可以仅查看大型数据集的选定部分。它能够重用组件来显示可滚动的项目列表。此功能对于允许用户滚动浏览产品列表、图片等非常有用。

回收布局的机制基于 MVC(模型-视图-控制器)架构。

  • RecycleView.data 属性构成模型层。

  • RecycleDataModel 类实现视图层。视图被分割成布局和视图,并使用适配器实现。它在 RecycleLayout 中定义,RecycleLayout 是一个抽象类。

  • 对于第三个组件——控制器——RecycleViewBehavior 类定义了逻辑交互。RecycleView 类实现逻辑。它在“kivy.uix.recycleview”模块中定义。

您需要实例化一个 RecycleView 对象,它会自动创建视图和数据类。RecycleView 的两个必须设置的重要属性是 viewclass 和 data。

  • viewclass − 将此属性设置为组件类的名称。可回收视图将由此类的对象组成。例如,如果 viewclass 是 Button,则回收视图将是可滚动的按钮列表。任何组件都可以用作此属性的值。

  • data − data 本质上是一个字典列表,并使用这些字典根据需要生成 viewclass 的实例。这是一个字典列表,其键映射到 viewclass 的相应属性名称。例如,如果 viewclass 设置为 Button,则数据可以是字典项列表,在每个字典中,键应该是 Button 类的属性之一。

RecycleView 组件树还必须包含某个布局管理器,以便可以找到视口。RecycleView 可以使用两种布局。一个是 RecycleBoxLayout(在“kivy.uix.recycleboxlayout”模块中可用),另一个是 RecycleGridLayout(在“kivy.uix.recyclegridlayout”模块中)。这两个布局类都继承了 BoxLayout 和 GridLayout 类。

示例

让我们在 RecycleView 组件中加载一百个按钮。它们被添加到 RecycleBoxLayout 中。

要将按钮用作回收视图中的元素,请将其 viewclass 设置为 Button。

其 data 属性是一个字典列表。每个字典都有一个“text”键,每个键的值都是按钮标题,例如 BTN 1、BTN 2 等。以下列表推导式语句组合了字典:

data=[{'text': 'BTN {}'.format(str(x))} for x in range(20)]

[{'text': 'BTN 0'}, {'text': 'BTN 1'}, {'text': 'BTN 2'},
{'text': 'BTN 3'}, {'text': 'BTN 4'}, {'text': 'BTN 5'},
{'text': 'BTN 6'}, {'text': 'BTN 7'}, {'text': 'BTN 8'},
{'text': 'BTN 9'}, {'text': 'BTN 10'}, {'text': 'BTN 11'},
{'text': 'BTN 12'}, {'text': 'BTN 13'}, {'text': 'BTN 14'},
{'text': 'BTN 15'}, {'text': 'BTN 16'}, {'text': 'BTN 17'},
{'text': 'BTN 18'}, {'text': 'BTN 19'}]

以下是 RecycleView 应用的“kv”语言脚本:

RecycleView:
   viewclass: 'Button'
   data: [{'text': 'BTN {}'.format(str(x))} for x in range(20)]
   RecycleBoxLayout:
      default_size: None, dp(56)
      default_size_hint: 1, None
      size_hint_y: None
      height: self.minimum_height
      orientation: 'vertical'

App 类只需要加载此“kv”文件,只需保留带有 pass 语句的 build() 方法即可。

from kivy.app import App
from kivy.uix.button import Button
from kivy.core.window import Window

Window.size = (720,400)
class recycled(App):
   def build(self):
      pass

recycled().run()

输出

通过运行上述 Python 脚本测试代码的输出。您应该会看到如下所示的可滚动按钮视图:

Kivy Recycle Layout
广告