Создайте простые каскады ListView

Я хочу создать простой ListView в Cascades (либо на C++, либо на QML). Данные ListView просты, просто строки, которые я хочу ему передать (никаких XML или SQL и т. д.); Также ListView может иметь разделы, например,

 - Green
        - Cucumber
        - Peas
        - Salad
 - Red
        - Tomato
        - Red Radish
        - Carrot

Кроме того, я хочу иметь возможность настраивать внешний вид элементов списка и, возможно, самого ListView (например, установить цвет фона, установить цвет текста элемента списка и т. д.).

Мы будем очень признательны за любой учебник или простое примерное приложение, которое достигает того, что я написал выше!

Спасибо.


person user2054339    schedule 06.03.2013    source источник


Ответы (2)


Самый простой способ, если вы собираетесь использовать только статический список (я имею в виду, что вы не хотите изменять его во время выполнения), — это загрузить его из XML-файла (например, model.xml в вашей папке assets), например это:

<model>
    <header title="Green"/>
    <item title="Cucumber"/>
    <item title="Peas"/>
    <item title="Salad"/>
    <header title="Red"/>
    <item title="Tomato"/>
    <item title="Red Radish"/>
    <item title="Carrot"/>
</model>

Вашему ListView просто нужно загрузить его:

ListView {
    dataModel: XmlDataModel {
        source: "model.xml"
    }
}

Теперь, если вы хотите настроить внешний вид, вам просто нужно указать в listItemComponents, как вы хотите, чтобы они отображались:

ListView {
    dataModel: XmlDataModel {
        source: "model.xml"
    }
    listItemComponents: [
        ListItemComponent {
            type: "header"
            Container {
                // your personal code
            }
        },
        ListItemComponent {
            type: "item"
            Container {
                // your personal code
            }
        }
    ]
}

Эти контейнеры позволяют вам определить свой собственный макет. Например, предположим, что вы хотите просто показать заголовок с соответствующим цветом фона, вы можете просто сделать:

ListView {
    dataModel: XmlDataModel {
        source: "model.xml"
    }
    listItemComponents: [
        ListItemComponent {
            type: "header"
            Container {
                background: {
                    if (ListItemData.title == "Green") {
                        return Color.Green
                    } else {
                        return Color.Red
                    }
                }
                Header {
                    title: ListItemData.title
                }
            }
        },
        ListItemComponent {
            type: "item"
            Container {
                preferredHeight: 100
                Label {
                    text: ListItemData.title
                    verticalAlignment: VerticalAlignment.Center
                }
                Divider {}
            }
        }
    ]
}

Надеюсь, это дало вам представление о том, как это работает.

person Dielson Sales    schedule 06.03.2013
comment
Спасибо, я уже использовал аналогичный подход -- на самом деле, с использованием XML. Но теперь мне может понадобиться вернуться к ситуации, когда данные могут поступать динамически (менять их во время выполнения?), какую модель данных использовать в этом случае? или что делать в таком случае? Благодарю. - person user2054339; 10.03.2013
comment
Здравствуйте, не могли бы вы сказать мне, почему я не могу использовать XML в качестве модели данных, если данные поступают во время выполнения??? Спасибо. - person user2054339; 12.03.2013
comment
Если вы собираетесь загрузить файл во время выполнения, вы должны загрузить его с помощью кода C++, поэтому вы можете использовать XMLDataAccess (developer.blackberry.com/cascades/reference/), чтобы преобразовать его содержимое в DataModel. - person Dielson Sales; 12.03.2013
comment
Привет, спасибо, я проверю вашу ссылку. Когда вы предложили, я подумал, что не могу использовать XML в качестве модели данных, если данные НЕ были статичными (появлялись во время выполнения). Это правда? - person user2054339; 12.03.2013
comment
Я мог бы использовать XMLDataAccess, чтобы получить, например, файл, полученный из HTTP-запроса. Если вы хотите, вы можете просто передать QList в DataModel и использовать метод insertList (каждый элемент должен быть QMap, как описано здесь: developer.blackberry.com/cascades/documentation/device_platform/). - person Dielson Sales; 12.03.2013
comment
Допустим, вы используете модель XML. Не могли бы вы каким-то образом поддержать перевод статей? - person Marc Plano-Lesay; 09.04.2013
comment
Думаю, нет. Но вы все равно можете загружать разные файлы XML в зависимости от языка... - person Dielson Sales; 10.04.2013

если я правильно понимаю, что вы хотите, как ExpandableListView в Android, вы можете добиться этого, используя реализацию bb::cascades::DataModel пример: здесь

person Ajeet47    schedule 09.03.2013