--- title: "List View" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{List View} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, echo=FALSE, message=FALSE} library(bslib) ``` ## Creating Different Types of Lists Lists are a great way to organize information in a structured way. And Framework7 provides a number of different list types to choose from, ranging from simple text lists to more complex lists with icons, groups, headers and footers. In `{shinyMobile}`, all these possibilities are available through the `f7List()` and `f7ListItem()` functions. ### Styling options There are 4 styling options available for lists: - __inset__: to make list block inset, which will make the list block appear indented. If used in combination with strong, it will also have rounded corners. - __outline__: to add outline (borders) around the list block - __dividers__: to add dividers (borders) between list items - __strong__: to add extra highlighting to list block ### Available mode options There are 4 different modes available for lists: - __simple__: to create a simple list - __links__: to create a list with links - __media__: to create a list with media elements - __contacts__: to create a grouped list ## Examples As you can imagine, there are a lot of possible combinations of these options. Below we will show some examples of how to create different types of lists. ### List items There are two different ways in which you can create items belonging in `f7List()`: 1. Using `tags$li()`, which is the most simple way to create a list item. Within this tag you can add any HTML content you like. 2. Using `f7ListItem()`, which gives you plenty of options to configure your list item. This is the recommended method. For example, the following code creates a simple list with 5 items using the first method: ```{r eval = FALSE} f7List( mode = "simple", lapply(1:5, function(j) { tags$li( paste("Item", j) ) }) ) ```
Using the second method, the code would look like: ```{r eval = FALSE} f7List( mode = "simple", lapply(1:5, function(j) { f7ListItem( title = paste("Item", j) ) }) ) ```
The styling of these two methods might differ slightly, because in the second method some CSS classes are added to the list items. However, in the case of a simple item like above, there's no difference. ### Simple list The most simple list has `mode` set to `"simple"` and no other options set: ```{r, eval=TRUE, echo=FALSE} card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23AAmSgA1tsAGLLAAyAGUAKK4c7qODwa5gcrCUzPFxnPaQrR5IzgqDKTg8F5nZzQABudCU2z2ADkoFSlNwLqQrhF+HtwZJbOjSVjdtzfvyyRw-nBkcJJDBUEYniKzuIHuIhgBGRAAVjhGTYBA+EG4ACsTM4QAqyVyeaQAJLkGCnMmO86XCURVBNcjRW2Ip7OY3ms49J2uAC+Qcd4dc4ZMGNcwmqFOqtN1+u4WlQLFIcOJGdIJrNmJD3TAIYAukA", # nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" ) ```
```{r, eval=FALSE} library(shiny) library(shinyMobile) shinyApp( ui = f7Page( title = "My app", options = list(dark = FALSE, theme = "ios"), f7SingleLayout( navbar = f7Navbar(title = "f7List"), f7List( mode = "simple", lapply(1:5, function(j) { f7ListItem( title = paste("Item", j) ) }) ) ) ), server = function(input, output) { } ) ```

Note that you need to use `title = ...` in `f7ListItem()` when using `f7List(mode = "simple", ...)`. Other arguments in `f7ListItem()` will be ignored when `mode` is `"simple"`.
Using the styling options, you can already drastically change the appearance of the list: ```{r, eval=TRUE, echo=FALSE} card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23AAmSgA1tsAGLLAAyAGUAKK4c7qODwa5gcrCUzPFxnPaQrR5IzgqDKTg8F5nZzQABudCU2z2ADkoFSlNwLqQrhF+HtwZJbOjSVjdtzfvyyRw-nBkcJJDBUEYniLXiw2VoJREACpYACqsIVrj+kgpknFDC+zg12oxZLJtgYJDy23NOsxVuc4ge4iGAEZEABWOEZNgED4QbgAKxMzhAuoFQtIAElyDBTi6yaz2c5UE1yNEE4ins5w9HXD0U84AL4lq2V4svEyW5zCaoU6q0wPB7haVBKuHErukCNRzFl7pgMsAXSAA", # nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" ) ```
```{r, eval=FALSE} library(shiny) library(shinyMobile) shinyApp( ui = f7Page( title = "My app", options = list(dark = FALSE, theme = "ios"), f7SingleLayout( navbar = f7Navbar(title = "f7List"), f7List( mode = "simple", outline = TRUE, dividers = TRUE, strong = TRUE, lapply(1:5, function(j) { f7ListItem( title = paste("Item", j) ) }) ) ) ), server = function(input, output) { } ) ```
### Simple link list When setting `mode` to `"links"`, the list items will be displayed as links: ```{r, eval=TRUE, echo=FALSE} card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23AAmSgA1tsAGLLAAyAGUAKK4c7qODwa5gcrCUzPFxnPaQrR5IzgqDKTg8F5nZzQABudCU2z2ADkoFSlNwLqQrhF+HtwZJbOjSVjdtzfvyyRw-nBkVIIIC0X5MWTXMSpRKIgAVLAAVVhIrOf0kFMk4oYX2c6q1GIVZ1sDBIeW2Zu18oV4ge4iGAEZEABWOEZNgED4QbgAKxMzhAOrJdjywgAJFJTpayVytIDuC66HBxNtUE1yNEAJLkGBPZyhuHqQIZZGxeKJZLURv5IhEPG5YglsA9JNnbtJgC+fbJQ+cfZMFucwmqFOqtP9ge4WlQLFIcOJy9IYYjmP73TA-YAukA", # nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" ) ```

In the example above, we're using `f7Link()` to create the links. This will automatically make sure that the links are opened in a new tab. ### Link list with header and footer To add some complexity to the link list, we can add a header and footer. In this case, we will use `f7ListItem()` to create the list items. It is important to set `mode` to `NULL` in `f7List()`: ```{r, eval=TRUE, echo=FALSE} card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23AAmSgA1tsAGLLAAyAGUAKK4c7qODwa5gcrCUzPFxnPaQrR5IzgqDKTg8F5nZzQABudCU2z2ADkoFSlNwLqQrhF+HtwZJbOjSVjdtzfvyyRw-nBtnSAKrg8EYslk4lSCASiIAFSwUthIrOf0kFMk4oYX2cGq18oVrlsDBIeW2Zu1mMt4ge4iGAEZEABWOEZNgED4QbgAKxMzhAOrJXJ5pAAkuQYKdLWTWeznKgmuRovHEU9nKGLcmzgioEbthnbCd+AAJOCl6p5guRhUZIhEdLlzNVsAgtvpRsmQtF5zqQIZZGxeKJZLUWf5Nt43LEGD8ZuuHpFgC+G4VO-XL0HL2E1Qp1Vp-sD3C0qBYpDhxJvpDDEcxm+6YE3AF0gA", # nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" ) ```
```{r, eval=FALSE} library(shiny) library(shinyMobile) shinyApp( ui = f7Page( title = "My app", options = list(dark = FALSE, theme = "ios"), f7SingleLayout( navbar = f7Navbar(title = "f7List"), f7List( mode = NULL, outline = TRUE, dividers = TRUE, strong = TRUE, lapply(1:5, function(j) { f7ListItem( title = paste("Item", j), header = paste("Header", j), footer = paste("Footer", j), href = "https://www.google.com" ) }) ) ) ), server = function(input, output) { } ) ```
### Grouped list A grouped list can be generated by using `f7ListGroup()`. The `mode` argument should be set to `"contacts"` in `f7List()`: ```{r, eval=TRUE, echo=FALSE} card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23AAmSgA1tsAGLLAAyAGUAKK4c7qODwa5gcrCUzPFxnPaQrR5IzgqDKTg8F5nZzQABudCU2z2ADkoFSlNwLqQrhF+HtwZJbOjSVjdtzfvyyRw-nBkcQyNlSGi-Jiya5iVIIBKIgAVLAAVVhIrOf0kFMk4oYX2cmp1GMVZ1sDBIeW2Ft1CsV4ge4iGABZEAA2OEZNgED4QbiSEzOEB6slcnmkADidpYqFO1rJrPZznB0PV6uhWEhwEkAF0ramyW70B7uABGRDVgAM-sDwe4ACtw5GXWXXDHbABJcgwFmXNXOVBNcjRfbVYQkJ7Odul7vL0VwA1QbZ2PLCAAkkhgeRTK5XogI23Htjg9eisXiiWSBD+EAwGUU8GoRAYgN2ZQqqDdOTqEQ4gmgIqBwG8Rh1NWPr1gAHjB9Z1POrZwvwGCtqgeRdF2x5liYS54d2ADEzhYFAEB-EQMBjkBqrkiwMB0NU9yhOQcGkFGRFkhe5DXvwADUnoAEzOD6bh4M4wiwP+JwNvWCmKYgACcqlqapcLViYPTccuOkrgAvvp+FcUZerGc4+kES8wjVBSLERAGEBBuUIZaKgLCkHCxIeaQHYvAZ3RgAZRZAA", # nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" ) ```
```{r, eval=FALSE} library(shiny) library(shinyMobile) shinyApp( ui = f7Page( title = "My app", options = list(dark = FALSE, theme = "ios"), f7SingleLayout( navbar = f7Navbar(title = "f7List"), f7List( mode = "contacts", outline = TRUE, dividers = TRUE, strong = TRUE, lapply(4:6, function(i) { f7ListGroup( title = LETTERS[i], lapply(1:10, function(j) { f7ListItem(title = paste("Person", j), media = tags$img( src = paste0("https://cdn.framework7.io/placeholder/people-160x160-", j, ".jpg") ), # Random phone number as text paste0("+42 6 ", sample(10000000:99999999, 1)) ) }) ) }) ) ) ), server = function(input, output) { } ) ```
By adding `media` to the `f7ListItem()`, you can display an image next to the list item, thereby making a pretty fancy contact list!
If desired, you can also use `f7Icon()`: ```{r, eval=TRUE, echo=FALSE} card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23AAmSgA1tsAGLLAAyAGUAKK4c7qODwa5gcrCUzPFxnPaQrR5IzgqDKTg8F5nZzQABudCU2z2ADkoFSlNwLqQrhF+HtwZJbOjSVjdtzfvyyRw-nBkcQyNlSGi-Jiya5iVIIBKIgAVLAAVVhIrOf0kFMk4oYX2cmp1GMVZ1sDBIeW2Ft1CsV4ge4iGABZEAA2OEZNgED4QbiSEzOEB6slcnmkADidpYqFO1rJrPZznB0PV6uhWEhwEkAF0ramyW70B7uABGRDVgAM-sDwe4ACtw5GXWXXDHbABJcgwFmXNXOVBNcjRfbVYQkJ7Odul7vL0VwA1QWm7PtS6KoGckAD6GUM4j5XZX3YAxM4sFAIH8iDAx+oSBKICwYHRqvdQuQAB6kFGF7WuOthwPW0QANQAMzVs4PpuHgzjCLAqBGDW9aYVh9aIAAnPhBH4XC1YmD0wEXmRK4AL6UWWtGKjRer0ZRJilsI1QUt+EQBhAQblCGWioCwpBwsSQmkB2LxUd0YBUUWQA", # nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" ) ```
```{r, eval=FALSE} library(shiny) library(shinyMobile) shinyApp( ui = f7Page( title = "My app", options = list(dark = FALSE, theme = "ios"), f7SingleLayout( navbar = f7Navbar(title = "f7List"), f7List( mode = "contacts", outline = TRUE, dividers = TRUE, strong = TRUE, lapply(4:6, function(i) { f7ListGroup( title = LETTERS[i], lapply(1:10, function(j) { f7ListItem(title = paste("Person", j), media = f7Icon("person_fill"), # Random phone number as text paste0("+31 6 ", sample(10000000:99999999, 1)) ) }) ) }) ) ) ), server = function(input, output) { } ) ```
### Media list With `mode` set to `"media"`, you can create a list with media objects, and you have the option to add a `subtitle` to the list items. Note that `header` and `footer` can't be used in a media list. ```{r, eval=TRUE, echo=FALSE} card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23AAmSgA1tsAGLLAAyAGUAKK4c7qODwa5gcrCUzPFxnPaQrR5IzgqDKTg8F5nZzQABudCU2z2ADkoFSlNwLqQrhF+HtwZJbOjSVjdtzfvyyRw-nBkfA-pIoE8Ra8WGytBKIgAVLAAVVh8tc0opknFDC+znVWoxZLJtgYJDy21N2sxFuc4ge4iGAEZEO6AAxwjJsAgfCDcSQmZwgHUCoWkACS5BgpydZNZ7OcqCa5GiqsuvjhofNSctJRTKrTGZO-EhxZzT2c+cjorg0qg2zseWEABJJDA8onC2dbMpU-w6EQGIa6oppSJEM4AByoAAeAG45Y7+65RARtunbHBvdFYvFEskCH8IBgMop4NQx4DdmUKqgXTl1ERxIaBKg4G8jHV3QAbN6i6Ad6dS1pIcL8BgABWqB5Hy64btQBpFMiuzevwDZnCYBYbqkeSxDu5bRFgkiEaQEG4dhri7pmlZEEi4g2tU5xwIupD3KOirwjyZYMBcBAsC6DB1vG8JQJx6hNPCEowEckgEPY5IsDAdDVFReH9uogQZMiADEWFIRaPSFgAvqZJn8pZ1GYsI1QUqxET+hAgblMGWioIqcLEl5pBhhGmJmd0YBmQAukAA", # nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" ) ```
```{r, eval=FALSE} library(shiny) library(shinyMobile) shinyApp( ui = f7Page( title = "My app", options = list(dark = FALSE, theme = "ios"), f7SingleLayout( navbar = f7Navbar(title = "f7List"), f7List( mode = "media", outline = TRUE, dividers = TRUE, strong = TRUE, lapply(1:10, function(i) { f7ListItem( title = paste("Title", i), subtitle = paste("Subtitle", i), media = tags$img( style = "border-radius: 8px;", src = paste0("https://cdn.framework7.io/placeholder/people-160x160-", i, ".jpg"), width = "70" ), right = paste("Right", i), paste("Some longer text about this particular item that has the magical number", i), href = "#" ) }) ) ) ), server = function(input, output) { } ) ```
The default media width is `50`. If you want to override this, you can add `width` to the `img` tag. ## Other Types of Lists The list view can be used in other cases as well: - To create a __virtual list__ with `f7VirtualList()` for displaying a list with a large number of items. - To create an inputs layout, where inputs can be nicely grouped and styled together inside an `f7List()`. You can read more about this in the [Inputs Layout](inputs-layout.html) vignette. - Swipeout is an extension of the list view that allows you to swipe over list elements to reveal a hidden menu with available actions. You can use `f7Swipeout()` and `f7SwipeOutItem()` for this.