Не получается вывести цветной список(widget.NewList) в Fyne

Рейтинг: 0Ответов: 1Опубликовано: 12.02.2023

Всем здравствуйте!
Я хочу вывести список с чередованием цветов красный-синий и вроде даже выводит, но есть какая-то проблема: если поиграться с окном(увеличивать/уменьшать) то отображаться начинает не верно(перемешиваются или вообще все становится одним цветом). Что я делаю не так или может так вообще не правильно и надо по другому?

package main

import (
    "fmt"
    "image/color"

    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/canvas"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/layout"
    "fyne.io/fyne/v2/theme"
    "fyne.io/fyne/v2/widget"
)

var myList = []string{"One", "Two", "Three", "Four", "Five", "Six"}

func main() {
    app := app.New()
    win := app.NewWindow("Example")
    win.CenterOnScreen()
    win.Resize(fyne.NewSize(320, 250))

    var (
        newTask    *fyne.Container
        mainScreen *fyne.Container
    )

    colorList := widget.NewList(
        func() int {
            return len(myList)
        },
        func() fyne.CanvasObject {
            canvas := container.New(
                layout.NewMaxLayout(),
                canvas.NewRectangle(color.RGBA{R: 0, G: 50, B: 245, A: 0}),
                widget.NewLabel(""),
            )
            return canvas
        },
        func(lii widget.ListItemID, co fyne.CanvasObject) {
            if lii%2 == 0 {
                co.(*fyne.Container).Objects[0].(*canvas.Rectangle).FillColor = color.RGBA{R: 255, G: 0, B: 0, A: 0}
            }
            co.(*fyne.Container).Objects[1].(*widget.Label).SetText(fmt.Sprintf("%d", lii))
        },
    )
    colorList.UnselectAll()

    // заглушка при на жатии на плюс
    dummy := container.NewVBox(
        container.NewHBox(
            widget.NewLabel("Empty"),
            layout.NewSpacer(),
            widget.NewButtonWithIcon("", theme.NavigateBackIcon(), func() {
                colorList.UnselectAll()
                colorList.Refresh()
                win.SetContent(mainScreen)
            }),
        ),
        container.NewCenter(
            widget.NewLabel("Nothing here"),
        ),
    )

    newTask = container.NewHBox(
        widget.NewLabel("Add"),
        layout.NewSpacer(),
        widget.NewButtonWithIcon("", theme.ContentAddIcon(), func() {
            win.SetContent(dummy)
        }),
    )

    mainScreen = container.NewBorder(
        newTask,
        nil,
        nil,
        nil,
        colorList,
    )

    win.SetContent(mainScreen)
    win.ShowAndRun()
}

Ответы

▲ 0

Написал ребятам из Fyne.io. Все оказалось гораздо проще: нужно в функции updateItem вызвать метод Refresh()

func(lii widget.ListItemID, co fyne.CanvasObject) {
            if lii%2 == 0 {
                co.(*fyne.Container).Objects[0].(*canvas.Rectangle).FillColor = color.RGBA{R: 255, G: 0, B: 0, A: 0}
                co.(*fyne.Container).Objects[0].(*canvas.Rectangle).Refresh()
            } else {
                co.(*fyne.Container).Objects[0].  *canvas.Rectangle).FillColor = color.RGBA{R: 0, G: 50, B: 245, A: 0}
                co.(*fyne.Container).Objects[0].(*canvas.Rectangle).Refresh()
            }
            co.(*fyne.Container).Objects[1].(*widget.Label).SetText(fmt.Sprintf("%d", lii))
        }