04. 列表类型

列表类型 #

为了展示如何连接更复杂的类型,我们将看看List控件以及数据绑定如何使其更易用。首先,我们创建一个StringList数据绑定,这是一个String数据类型的列表。一旦我们有了列表类型的数据,我们就可以将这个数据连接到标准的List控件。为此,我们使用widget.NewListWithData构造函数,这和其他控件类似。

将这段代码与 列表教程进行比较,你会看到两个主要变化,第一个是我们将数据类型作为第一个参数传递,而不是长度回调函数。第二个变化是最后一个参数,我们的UpdateItem回调。修订版采用binding.DataItem值而不是widget.ListIndexID。使用这种回调结构时,我们应该Bind到模板标签控件而不是调用SetText。这意味着如果数据源中的任何字符串发生变化,表格的每个受影响行都将刷新。

package main

import (
	"fmt"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/data/binding"
	"fyne.io/fyne/v2/widget"
)

func main() {
	myApp := app.New()
	myWindow := myApp.NewWindow("List Data")

	data := binding.BindStringList(
		&[]string{"Item 1", "Item 2", "Item 3"},
	)

	list := widget.NewListWithData(data,
		func() fyne.CanvasObject {
			return widget.NewLabel("template")
		},
		func(i binding.DataItem, o fyne.CanvasObject) {
			o.(*widget.Label).Bind(i.(binding.String))
		})

	add := widget.NewButton("Append", func() {
		val := fmt.Sprintf("Item %d", data.Length()+1)
		data.Append(val)
	})
	myWindow.SetContent(container.NewBorder(nil, add, nil, nil, list))
	myWindow.ShowAndRun()
}

在我们的演示代码中,有一个“Append”按钮,当点击时,它会向数据源追加一个新值。这样做将自动触发数据变化处理程序并扩展List控件以显示新数据。