This code places an Elementary list widgets on a window, along with some buttons trigerring actions on it (though its A\+PI).

It covers most of elm\+\_\+list\+\_\+item functions.

On our {\ttfamily main} function, we are adding a default list with 3 items. We are only setting their labels (second parameter of function elm\+\_\+list\+\_\+item\+\_\+append)\+:  
\begin{DoxyCodeInclude}
   li = elm_list_add(win);
   evas\_object\_size\_hint\_weight\_set(li, EVAS\_HINT\_EXPAND, EVAS\_HINT\_EXPAND);
   evas\_object\_size\_hint\_align\_set(li, EVAS\_HINT\_FILL, EVAS\_HINT\_FILL);
   elm\_box\_pack\_end(bx, li);

   elm\_list\_item\_append(li, \textcolor{stringliteral}{"Item 0"}, NULL, NULL, NULL, NULL);
   elm\_list\_item\_append(li, \textcolor{stringliteral}{"Item 1"}, NULL, NULL, NULL, NULL);
   elm\_list\_item\_append(li, \textcolor{stringliteral}{"Item 2"}, NULL, NULL, NULL, NULL);

\end{DoxyCodeInclude}


Next we are adding lots of buttons, each one for a callback function that will realize a task covering part of list items A\+PI. Lets check the first one\+: 
\begin{DoxyCodeInclude}
   bt = elm_button_add(win);
   elm\_object\_text\_set(bt, \textcolor{stringliteral}{"Prepend item"});
   evas\_object\_smart\_callback\_add(bt, \textcolor{stringliteral}{"clicked"}, \_prepend\_cb, li);
   elm\_box\_pack\_end(hbx, bt);
   evas\_object\_size\_hint\_weight\_set(bt, EVAS\_HINT\_EXPAND, 0);
   evas\_object\_size\_hint\_align\_set(bt, EVAS\_HINT\_FILL, 0);
   evas\_object\_show(bt);

\end{DoxyCodeInclude}


We are labeling the button with a task description with elm\+\_\+object\+\_\+text\+\_\+set() and setting a callback function evas\+\_\+object\+\_\+smart\+\_\+callback\+\_\+add(). Each callback function will have the signature\+: {\ttfamily  static void \+\_\+task\+\_\+cb(void $\ast$data, Evas\+\_\+\+Object $\ast$obj, void $\ast$event\+\_\+info)} with the function name varying for each task.

Now let\textquotesingle{}s cover all of them.

{\bfseries  Prepending an item\+: }  
\begin{DoxyCodeInclude}
\_prepend\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *list\_it;
   Evas\_Object *li = data;
   \textcolor{keywordtype}{char} label[32];

   snprintf(label, \textcolor{keyword}{sizeof}(label), \textcolor{stringliteral}{"Item %i"}, counter++);
   list\_it = elm\_list\_item\_prepend(li, label, NULL, NULL, NULL, NULL);
   elm\_list\_go(li);
   \textcolor{keywordflow}{if} (!list\_it)
     printf(\textcolor{stringliteral}{"Error adding item\(\backslash\)n"});
\}

\end{DoxyCodeInclude}


The item will be placed on the beginning of the list, i.\+e. it will be the first one.

The first parameter of elm\+\_\+list\+\_\+item\+\_\+prepend() is the list object, that we are receiving as data on our callback function. The second one is a label, the string that will be placed in the center of our item. As we don\textquotesingle{}t wan\textquotesingle{}t icons or callback functions, we can send N\+U\+LL as third, fourth, fifth and sixth parameters.

{\bfseries  Appending an item\+: }  
\begin{DoxyCodeInclude}
\_add\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *list\_it;
   Evas\_Object *li = data;
   \textcolor{keywordtype}{char} label[32];

   snprintf(label, \textcolor{keyword}{sizeof}(label), \textcolor{stringliteral}{"Item %i"}, counter++);
   list\_it = elm\_list\_item\_append(li, label, NULL, NULL, NULL, NULL);
   elm\_list\_go(li);
   \textcolor{keywordflow}{if} (!list\_it)
     printf(\textcolor{stringliteral}{"Error adding item\(\backslash\)n"});
\}

\end{DoxyCodeInclude}


Items included with append will be inserted inserted after the last one.

{\bfseries  Appending an item with icon\+: }  
\begin{DoxyCodeInclude}
\_add\_ic\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *list\_it;
   Evas\_Object *ic, *li = data;
   \textcolor{keywordtype}{char} label[32];

   snprintf(label, \textcolor{keyword}{sizeof}(label), \textcolor{stringliteral}{"Item %i"}, counter++);
   ic = elm_icon_add(li);
   elm\_icon\_standard\_set(ic, \textcolor{stringliteral}{"home"});
   elm\_image\_resizable\_set(ic, EINA\_FALSE, EINA\_FALSE);

   list\_it = elm\_list\_item\_append(li, label, ic,  NULL, NULL, NULL);
   elm\_list\_go(li);
   \textcolor{keywordflow}{if} (!list\_it)
     printf(\textcolor{stringliteral}{"Error adding item with icon\(\backslash\)n"});
\}

\end{DoxyCodeInclude}


If an icon is required, you can pass it as third parameter on our elm\+\_\+list\+\_\+item\+\_\+append() function. It will be place on the left side of item\textquotesingle{}s label. If an icon is wanted on the right side, it should be passed as fourth parameter.

For more details about how to create icons, look for elm\+\_\+icon examples \hyperlink{tutorial_icon}{Icon example}.

{\bfseries  Appending an item with callback function for selected\+: }  
\begin{DoxyCodeInclude}
\_sel\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *list\_it = event\_info;
   printf(\textcolor{stringliteral}{"Selected label: %s\(\backslash\)n"}, elm\_object\_item\_text\_get(list\_it));
\}

\textcolor{keyword}{static} \textcolor{keywordtype}{void}
\_add\_func\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *list\_it;
   Evas\_Object *li = data;
   \textcolor{keywordtype}{char} label[32];

   snprintf(label, \textcolor{keyword}{sizeof}(label), \textcolor{stringliteral}{"Item %i"}, counter++);
   list\_it = elm\_list\_item\_append(li, label, NULL, NULL, \_sel\_cb, NULL);
   elm\_list\_go(li);
   \textcolor{keywordflow}{if} (!list\_it)
     printf(\textcolor{stringliteral}{"Error adding item\(\backslash\)n"});
\}

\end{DoxyCodeInclude}


To set a callback function that will be called every time an item is selected, i.\+e., everytime the list stops with this item in center position, just pass the function as fifth parameter.

{\bfseries  Appending an item with callback function for selected with data\+: }  
\begin{DoxyCodeInclude}
\_sel\_data\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   \textcolor{keywordtype}{char} *content = data;
   Elm_Object_Item *list\_it = event\_info;
   printf(\textcolor{stringliteral}{"Selected label: %s with data: %s\(\backslash\)n"},
          elm\_object\_item\_text\_get(list\_it), content);
\}

\textcolor{keyword}{static} \textcolor{keywordtype}{void}
\_free\_data(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   free(data);
\}

\textcolor{keyword}{static} \textcolor{keywordtype}{void}
\_add\_data\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *list\_it;
   Evas\_Object *li = data;
   \textcolor{keywordtype}{char} label[32];
   \textcolor{keywordtype}{char} *content = malloc(\textcolor{keyword}{sizeof}(\textcolor{keywordtype}{char}) * 32);

   snprintf(content, 32, \textcolor{stringliteral}{"Item content %i"}, counter);
   snprintf(label, \textcolor{keyword}{sizeof}(label), \textcolor{stringliteral}{"Item %i"}, counter++);
   list\_it = elm\_list\_item\_append(li, label, NULL, NULL, \_sel\_data\_cb, content);
   elm\_list\_go(li);
   \textcolor{keywordflow}{if} (!list\_it)
     \{
        printf(\textcolor{stringliteral}{"Error adding item\(\backslash\)n"});
        \textcolor{keywordflow}{return};
     \}
   elm\_object\_item\_del\_cb\_set(list\_it, \_free\_data);
\}

\end{DoxyCodeInclude}


If the callback function request an extra data, it can be attached to our item passing a pointer for data as sixth parameter. Our function \+\_\+sel\+\_\+data\+\_\+cb will receive it as {\ttfamily  void $\ast$data }.

If you want to free this data, or handle that the way you need when the item is deleted, set a callback function for that, with elm\+\_\+object\+\_\+item\+\_\+del\+\_\+cb\+\_\+set().

As you can see we check if {\ttfamily it} is not {\ttfamily N\+U\+LL} after appending it. If an error happens, we won\textquotesingle{}t try to set a function for it.

{\bfseries  Deleting an item\+: }  
\begin{DoxyCodeInclude}
\_del\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item;
   Evas\_Object *li = data;

   selected\_item = elm\_list\_selected\_item\_get(li);
   elm\_object\_item\_del(selected\_item);
   elm\_list\_go(li);
\}

\end{DoxyCodeInclude}


To delete an item we simple need to call elm\+\_\+object\+\_\+item\+\_\+del() with a pointer for such item.

If you need, you can get selected item with elm\+\_\+list\+\_\+selected\+\_\+item\+\_\+get(), that will return a pointer for it.

{\bfseries  Unselecting an item\+: }  
\begin{DoxyCodeInclude}
\_unselect\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item;
   Evas\_Object *li = data;

   selected\_item = elm\_list\_selected\_item\_get(li);
   elm\_list\_item\_selected\_set(selected\_item, EINA\_FALSE);
\}

\end{DoxyCodeInclude}


To select an item, you should call elm\+\_\+list\+\_\+item\+\_\+selected\+\_\+set() passing {\ttfamily E\+I\+N\+A\+\_\+\+T\+R\+UE}, and to unselect it, {\ttfamily E\+I\+N\+A\+\_\+\+F\+A\+L\+SE}.

{\bfseries  Printing all items\+: }  
\begin{DoxyCodeInclude}
\_print\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   \textcolor{keyword}{const} Eina\_List *l, *items;
   Elm_Object_Item *list\_it;
   Evas\_Object *li = data;

   items = elm\_list\_items\_get(li);
   EINA\_LIST\_FOREACH(items, l, list\_it)
     printf("%s\(\backslash\)n", elm\_object\_item\_text\_get(list\_it));
\}

\end{DoxyCodeInclude}


{\bfseries  Clearing the list\+: }  
\begin{DoxyCodeInclude}
\_clear\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Evas\_Object *li = data;
   elm\_list\_clear(li);
\}

\end{DoxyCodeInclude}


{\bfseries  Selecting the next item\+: }  
\begin{DoxyCodeInclude}
\_select\_next\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item, *next\_item;
   Evas\_Object *li = data;

   selected\_item = elm\_list\_selected\_item\_get(li);
   \textcolor{keywordflow}{if} (!selected\_item) \textcolor{keywordflow}{return};

   next\_item = elm\_list\_item\_next(selected\_item);
   \textcolor{keywordflow}{if} (next\_item)
     elm\_list\_item\_selected\_set(next\_item, EINA\_TRUE);
\}

\end{DoxyCodeInclude}


{\bfseries  Inserting after an item\+: }  
\begin{DoxyCodeInclude}
\_insert\_after\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item, *list\_it;
   Evas\_Object *li = data;
   \textcolor{keywordtype}{char} label[32];

   selected\_item = elm\_list\_selected\_item\_get(li);
   \textcolor{keywordflow}{if} (!selected\_item) \textcolor{keywordflow}{return};

   snprintf(label, \textcolor{keyword}{sizeof}(label), \textcolor{stringliteral}{"Item %i"}, counter++);
   list\_it = elm\_list\_item\_insert\_after(li, selected\_item, label, NULL, NULL,
                                        NULL, NULL);
   elm\_list\_go(li);
   \textcolor{keywordflow}{if} (!list\_it)
     printf(\textcolor{stringliteral}{"Error adding item\(\backslash\)n"});
\}

\end{DoxyCodeInclude}


{\bfseries  Selecting the previous item\+: }  
\begin{DoxyCodeInclude}
\_select\_prev\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item, *prev\_item;
   Evas\_Object *li = data;

   selected\_item = elm\_list\_selected\_item\_get(li);
   \textcolor{keywordflow}{if} (!selected\_item) \textcolor{keywordflow}{return};

   prev\_item = elm\_list\_item\_prev(selected\_item);
   \textcolor{keywordflow}{if} (prev\_item)
     elm\_list\_item\_selected\_set(prev\_item, EINA\_TRUE);
\}

\end{DoxyCodeInclude}


{\bfseries  Inserting before an item\+: }  
\begin{DoxyCodeInclude}
\_insert\_before\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item, *list\_it;
   Evas\_Object *li = data;
   \textcolor{keywordtype}{char} label[32];

   selected\_item = elm\_list\_selected\_item\_get(li);
   \textcolor{keywordflow}{if} (!selected\_item) \textcolor{keywordflow}{return};

   snprintf(label, \textcolor{keyword}{sizeof}(label), \textcolor{stringliteral}{"Item %i"}, counter++);
   list\_it = elm\_list\_item\_insert\_before(li, selected\_item, label, NULL, NULL,
                                         NULL, NULL);
   elm\_list\_go(li);
   \textcolor{keywordflow}{if} (!list\_it)
     printf(\textcolor{stringliteral}{"Error adding item\(\backslash\)n"});
\}

\end{DoxyCodeInclude}


If a separator is required, just set an item as such\+:  
\begin{DoxyCodeInclude}
\_set\_separator\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item;
   Evas\_Object *li = data;

   selected\_item = elm\_list\_selected\_item\_get(li);
   \textcolor{keywordflow}{if} (!selected\_item) \textcolor{keywordflow}{return};
   elm\_list\_item\_separator\_set(selected\_item, EINA\_TRUE);
   elm\_list\_go(li);
\}

\end{DoxyCodeInclude}


Also an item can be disabled, and the user won\textquotesingle{}t be allowed to (un)select it\+:  
\begin{DoxyCodeInclude}
\_disable\_cb(\textcolor{keywordtype}{void} *data, Evas\_Object *obj, \textcolor{keywordtype}{void} *event\_info)
\{
   Elm_Object_Item *selected\_item;
   Evas\_Object *li = data;

   selected\_item = elm\_list\_selected\_item\_get(li);
   \textcolor{keywordflow}{if} (!selected\_item) \textcolor{keywordflow}{return};
   elm\_object\_item\_disabled\_set(selected\_item, EINA\_TRUE);
\}

\end{DoxyCodeInclude}


See the full \hyperlink{list_example_03_8c-example}{list\+\_\+example\+\_\+03.c} code, whose window should look like this picture\+:

 
\begin{DoxyImageNoCaption}
  \mbox{\includegraphics[width=\textwidth]{screenshots/list_example_03}}
\end{DoxyImageNoCaption}
 