1page.title=Layouts 2page.tags=vista,grupodevistas 3@jd:body 4 5<div id="qv-wrapper"> 6<div id="qv"> 7 <h2>Neste documento</h2> 8<ol> 9 <li><a href="#write">Programação do XML</a></li> 10 <li><a href="#load">Carregamento do recurso XML</a></li> 11 <li><a href="#attributes">Atributos</a> 12 <ol> 13 <li><a href="#id">ID</a></li> 14 <li><a href="#layout-params">Parâmetros do layout</a></li> 15 </ol> 16 </li> 17 <li><a href="#Position">Posição do layout</a></li> 18 <li><a href="#SizePaddingMargins">Tamanho, preenchimento e margens</a></li> 19 <li><a href="#CommonLayouts">Layouts comuns</a></li> 20 <li><a href="#AdapterViews">Criação de layouts com um adaptador</a> 21 <ol> 22 <li><a href="#FillingTheLayout">Preenchimento da vista de um adaptador com dados</a></li> 23 <li><a href="#HandlingUserSelections">Tratamento de eventos de clique</a></li> 24 </ol> 25 </li> 26</ol> 27 28 <h2>Classes principais</h2> 29 <ol> 30 <li>{@link android.view.View}</li> 31 <li>{@link android.view.ViewGroup}</li> 32 <li>{@link android.view.ViewGroup.LayoutParams}</li> 33 </ol> 34 35 <h2>Veja também</h2> 36 <ol> 37 <li><a href="{@docRoot}training/basics/firstapp/building-ui.html">Construção de uma interface do usuário 38simples</a></li> </div> 39</div> 40 41<p>O layout define a estrutura visual para uma interface do usuário, como a IU de uma <a href="{@docRoot}guide/components/activities.html">atividade</a> ou de um <a href="{@docRoot}guide/topics/appwidgets/index.html">widget de aplicativo</a>. 42É possível declarar um layout de dois modos:</p> 43<ul> 44<li><strong>Declarar elementos da IU em XML</strong>. O Android fornece um vocabulário XML 45direto que corresponde às classes e subclasses de View, como as de widgets e layouts.</li> 46<li><strong>Instanciar elementos do layout em tempo de execução</strong>. 47O aplicativo pode criar objetos de View e ViewGroup (e manipular suas propriedades) programaticamente. </li> 48</ul> 49 50<p>A estrutura do Android é flexível para usar um destes métodos ou ambos para declarar e gerenciar a IU do seu aplicativo. Por exemplo: você pode declarar um layout padrão do aplicativo em XML, e incluir os elementos da tela que aparecerão neles e suas propriedades. Em seguida, você poderia adicionar códigos ao aplicativo que modificariam o estado dos objetos da tela, inclusive os declarados em XML, em tempo de execução. </p> 51 52<div class="sidebox-wrapper"> 53<div class="sidebox"> 54 <ul> 55 <li>A <a href="{@docRoot}tools/sdk/eclipse-adt.html">Extensão 56ADT para Eclipse</a> oferece uma pré-visualização do layout do XML — 57com o arquivo XML aberto, selecione a guia <strong>Layout</strong>.</li> 58 <li>Pode-se usar também a 59 ferramenta de <a href="{@docRoot}tools/debugging/debugging-ui.html#hierarchyViewer">Visualização de hierarquia</a> 60para depurar layouts — ela revela os valores de propriedades do layout, 61desenha o esqueleto do layout com indicadores de preenchimento/margens e vistas totalmente renderizadas 62e a depuração pode ocorrer no emulador ou no dispositivo.</li> 63 <li>A ferramenta <a href="{@docRoot}tools/debugging/debugging-ui.html#layoutopt">layoutopt</a> permite 64 a rápida análise dos layouts e hierarquias com relação a ineficiências e outros problemas.</li> 65</div> 66</div> 67 68<p>A vantagem de declarar a IU em XML é separar melhor a apresentação do aplicativo a partir do código que controla seu comportamento. As descrições da IU são externas ao código do aplicativo, ou seja, é possível modificá-la ou adaptá-la sem modificar o código-fonte e recompilar. Por exemplo: é possível criar layouts XML para diferentes orientações de tela, diferentes tamanhos de tela de dispositivos e diferentes idiomas. Além disso, a declaração de layout em XML facilita a exibição da estrutura da sua IU, o que facilita a depuração de problemas. Assim sendo, este documento se concentrará em ensinar a declarar o layout em XML. Se você 69estiver interessado em instanciar objetos View em tempo de execução, consulte as referências das classes 70{@link android.view.ViewGroup} e {@link android.view.View}.</p> 71 72<p>Em geral, o vocabulário XML para declarar elementos da IU segue rigorosamente a estrutura e a atribuição de nome às classes e aos métodos, em que os nomes de elementos correspondem a nomes de classe e nomes de atributos correspondem a métodos. Na verdade, a correspondência normalmente é tão direta que é possível supor qual atributo XML corresponde a determinado método de classe ou supor qual classe corresponde a certo elemento XML. Contudo, observe que nem todo vocabulário é idêntico. Em alguns casos, há pequenas diferenças de nome. Por exemplo: 73o elemento EditText tem um atributo <code>text</code> que corresponde 74a <code>EditText.setText()</code>. </p> 75 76<p class="note"><strong>Dica:</strong> Veja os diferentes tipos de layout em <a href="{@docRoot}guide/topics/ui/layout-objects.html">Objetos 77de layout comuns</a>. Também há uma coleção de tutoriais sobre a criação de diversos layouts 78no guia de tutorial <a href="{@docRoot}resources/tutorials/views/index.html">Vistas de boas-vindas</a>.</p> 79 80<h2 id="write">Programação do XML</h2> 81 82<p>Usando o vocabulário XML do Android, é possível projetar rapidamente layouts de IU e os elementos de tela intrínsecos do mesmo modo que se cria páginas web em HTML — com uma série de elementos aninhados. </p> 83 84<p>Cada arquivo de layout deve conter exatamente um elemento raiz, que deve ser um objeto View ou ViewGroup. Com o elemento raiz definido, é possível adicionar objetos ou widgets de layout extras como elementos filho para construir gradualmente uma hierarquia de View que define o layout. Por exemplo: eis um layout XML que usa um {@link android.widget.LinearLayout} vertical 85para conter uma {@link android.widget.TextView} e um {@link android.widget.Button}:</p> 86<pre> 87<?xml version="1.0" encoding="utf-8"?> 88<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 89 android:layout_width="match_parent" 90 android:layout_height="match_parent" 91 android:orientation="vertical" > 92 <TextView android:id="@+id/text" 93 android:layout_width="wrap_content" 94 android:layout_height="wrap_content" 95 android:text="Hello, I am a TextView" /> 96 <Button android:id="@+id/button" 97 android:layout_width="wrap_content" 98 android:layout_height="wrap_content" 99 android:text="Hello, I am a Button" /> 100</LinearLayout> 101</pre> 102 103<p>Após declarar o layout no XML, salve o arquivo com uma extensão <code>.xml</code> 104no diretório <code>res/layout/</code> do projeto do Android para compilá-lo adequadamente. </p> 105 106<p>Veja mais informações sobre a sintaxe de um arquivo XML de layout no documento <a href="{@docRoot}guide/topics/resources/layout-resource.html">Recursos de layout</a>.</p> 107 108<h2 id="load">Carregamento do recurso XML</h2> 109 110<p>Ao compilar o aplicativo, cada arquivo de layout XML é compilado 111em um recurso {@link android.view.View}. Deve-se carregar o recurso de layout do código do aplicativo 112na implementação de retorno de chamada {@link android.app.Activity#onCreate(android.os.Bundle) Activity.onCreate()}. 113Para isso, chame <code>{@link android.app.Activity#setContentView(int) setContentView()}</code>, 114passando a referência para o recurso de layout na forma: 115<code>R.layout.<em>layout_file_name</em></code>. 116Por exemplo: se o layout XML for salvo como <code>main_layout.xml</code>, será necessário carregá-lo 117para a Atividade desta forma:</p> 118<pre> 119public void onCreate(Bundle savedInstanceState) { 120 super.onCreate(savedInstanceState); 121 setContentView(R.layout.main_layout); 122} 123</pre> 124 125<p>O método de retorno de chamada <code>onCreate()</code> na Atividade é chamado pela estrutura do Android quando 126ela é inicializada (veja a discussão sobre ciclos de vida no documento 127<a href="{@docRoot}guide/components/activities.html#Lifecycle">Atividades</a> 128).</p> 129 130 131<h2 id="attributes">Atributos</h2> 132 133<p>Cada objeto View e ViewGroup aceita uma variedade própria de atributos XML. 134Alguns atributos são específicos de um objeto View (por exemplo, TextView aceita o atributo 135<code>textSize</code>), mas esses atributos também são herdados de objetos View que possam estender essa classe. 136Alguns são comuns a todos os objetos View porque são herdados da classe View raiz (como 137o atributo <code>id</code>). Além disso, outros atributos são considerados "parâmetros do layout", que são 138os que descrevem determinadas orientações de layout do objeto View conforme definido pelo objeto 139ViewGroup pai daquele objeto.</p> 140 141<h3 id="id">ID</h3> 142 143<p>Qualquer objeto View pode ter um ID de número inteiro associado para identificar exclusivamente o View dentro da árvore. 144Ao compilar o aplicativo, esse ID é referenciado como um número inteiro, mas o ID normalmente 145é atribuído no arquivo XML do layout como uma string, no atributo <code>id</code>. 146É um atributo XML comum a todos os objetos View 147(definido pela classe {@link android.view.View}) e você o usará com frequência. 148A sintaxe de um ID, dentro de uma tag XML, é:</p> 149<pre>android:id="@+id/my_button"</pre> 150 151<p>Um símbolo de arroba (@) no início da string indica que o analisador XML deve analisar e expandir o restante 152da string de ID e identificá-la como um recurso de ID. O símbolo de mais (+) significa que é um novo nome de recurso que precisa 153ser criado e adicionado aos recursos (no arquivo <code>R.java</code>). Há diversos outros recursos de ID 154oferecidos pela estrutura do Android. Ao referenciar um ID de recurso do Android, não é necessário ter o símbolo de mais, 155mas deve-se adicionar o conjunto de nomes (namespace) do pacote <code>android</code> da seguinte maneira:</p> 156<pre>android:id="@android:id/empty"</pre> 157<p>Com o conjunto de nomes (namespace) do pacote <code>android</code> em vigor, podemos referenciar um ID da classe 158de recursos <code>android.R</code> em vez de um da classe de recursos locais.</p> 159 160<p>Para criar vistas e referenciá-las a partir do aplicativo, um modo padrão comum é:</p> 161<ol> 162 <li>Definir uma visualizaçãovistawidget no arquivo de layout e atribuir um ID exclusivo a ele/ela: 163<pre> 164<Button android:id="@+id/my_button" 165 android:layout_width="wrap_content" 166 android:layout_height="wrap_content" 167 android:text="@string/my_button_text"/> 168</pre> 169 </li> 170 <li>Em seguida, crie uma instância do objeto de vista e capture-a do layout 171(normalmente no método <code>{@link android.app.Activity#onCreate(Bundle) onCreate()}</code>): 172<pre> 173Button myButton = (Button) findViewById(R.id.my_button); 174</pre> 175 </li> 176</ol> 177<p>Definir IDs para objetos de vista é importante ao criar um {@link android.widget.RelativeLayout}. 178Em um layout relativo, vistas irmãs podem definir o layout relativo para outra vista irmã 179referenciada pelo ID exclusivo.</p> 180<p>Os Ids não precisam ser exclusivo por toda a árvore, mas devem ser 181exclusivos dentro da parte da árvore em que se está procurando (que pode, com frequência, ser toda a árvore, portanto é preferível 182ser totalmente exclusivo sempre que possível).</p> 183 184 185<h3 id="layout-params">Parâmetros do layout</h3> 186 187<p>Os atributos do layout XML chamados <code>layout_<em>something</em></code> definem 188parâmetros para a View que for apropriado para a ViewGroup em que reside.</p> 189 190<p>Cada classe ViewGroup implementa uma classe aninhada que estende {@link 191android.view.ViewGroup.LayoutParams}. Essa subclasse 192contém tipos de propriedade que definem o tamanho e a posição de cada vista filha, conforme 193o necessário para o grupo de vistas. Como se pode ver na figura 1, um grupo de vistas 194pais define parâmetros de layout para cada vista filha (incluindo o grupo de vistas filhas).</p> 195 196<img src="{@docRoot}images/layoutparams.png" alt="" /> 197<p class="img-caption"><strong>Figura 1.</strong> Vista de uma hierarquia de vistas com parâmetros 198de layout associados a cada uma delas.</p> 199 200<p>Observe que cada subclasse LayoutParams tem a própria sintaxe para definir 201valores. Cada elemento filho deve definir LayoutParams apropriados para seu pai, 202embora possa também definir diferentes LayoutParams para os próprios filhos. </p> 203 204<p>Todos os grupos de vistas contêm largura e altura (<code>layout_width</code> e 205<code>layout_height</code>) e cada vista é obrigatória para defini-las. Muitos 206LayoutParams também contêm margens e bordas opcionais. <p> 207 208<p>É possível especificar largura e altura com medidas exatas, embora não seja 209recomendável na maioria dos casos. Em geral, usa-se uma destas constantes para 210definir a largura e a altura: </p> 211 212<ul> 213 <li><var>wrap_content</var> instrui a vista a dimensionar-se de acordo com 214as medidas exigidas pelo conteúdo.</li> 215 <li><var>match_parent</var> (de nome <var>fill_parent</var> antes da API de nível 8) 216instrui a vista a tornar-se tão grande quanto o grupo de vistas pais permitir.</li> 217</ul> 218 219<p>Em geral, a especificação de largura e altura de um layout com unidades absolutas, como 220pixels, não é recomendada. Em vez disso, usam-se medidas relativas como 221unidades de pixel independentes de densidade (<var>dp</var>), <var>wrap_content</var>ou 222<var>match_parent</var>, é uma abordagem melhor porque ajuda a garantir 223que o aplicativo exiba o conteúdo adequadamente dentre diversos tamanhos de tela de dispositivos. 224Os tipos de medidas aceitos são definidos no documento 225<a href="{@docRoot}guide/topics/resources/available-resources.html#dimension"> 226Recursos disponíveis</a>.</p> 227 228 229<h2 id="Position">Posição do layout</h2> 230 <p> 231 A geometria de uma vista de um retângulo. As vistas têm uma localização, 232 expressa como um par de coordenadas <em>esquerda</em> e <em>topo</em> 233 e duas dimensões, expressas como largura e altura. A unidade de localização 234 e de dimensões é o pixel. 235 </p> 236 237 <p> 238 É possível recuperar a localização de uma vista chamando os métodos 239 {@link android.view.View#getLeft()} e {@link android.view.View#getTop()}. O primeiro retorna a coordenada 240 esquerda, ou X, do retângulo que representa a vista. O último retorna a coordenada 241 topo, ou Y, do retângulo que representa a vista. Esses métodos 242 retornam a localização da vista em relação ao pai correspondente. Por exemplo: 243 quando <code>getLeft()</code> retorna 20, significa que a vista se localiza 20 pixels à 244 direita da borda esquerda do seu pai direto. 245 </p> 246 247 <p> 248 Adicionalmente, diversos métodos de conveniência são oferecidos para evitar cálculos 249desnecessárias, chamados {@link android.view.View#getRight()} e {@link android.view.View#getBottom()}. 250 Esses métodos retornam as coordenadas das bordas direita e de baixo 251 do retângulo que representa a vista. Por exemplo: chamar {@link android.view.View#getRight()} 252 é semelhante ao seguinte cálculo: <code>getLeft() + getWidth()</code>. 253 </p> 254 255 256<h2 id="SizePaddingMargins">Tamanho, preenchimento e margens</h2> 257 <p> 258 O tamanho de uma vista é expresso por largura e altura. As vistas, na verdade, 259 têm dois pares de valores de largura e altura. 260 </p> 261 262 <p> 263 O primeiro par é conhecido como <em>largura medida</em> 264 e <em>altura medida</em>. Essas dimensões definem o tamanho que a vista terá 265 dentro da vista pai. 266 Para obter as dimensões medidas, chamam-se {@link android.view.View#getMeasuredWidth()} 267 e {@link android.view.View#getMeasuredHeight()}. 268 </p> 269 270 <p> 271 O segundo par é simplesmente conhecido como <em>largura</em> e <em>altura</em> ou, 272 às vezes, <em>largura do desenho</em> e <em>altura do desenho</em>. Essas 273 dimensões definem o tamanho real da vista na tela, em tempo de desenho e 274 após o layout. Esses valores podem diferir da largura 275 e da altura medidas. Para obter os valores de largura e altura, chamam-se 276 {@link android.view.View#getWidth()} e {@link android.view.View#getHeight()}. 277 </p> 278 279 <p> 280 Para medir as dimensões, a vista leva em conta o preenchimento. O preenchimento 281 é expresso em pixels para a esquerda, a direita e as partes de cima e de baixo da vista. 282 O preenchimento pode ser usado para compensar o conteúdo da vista por um número específico 283 de pixels. Por exemplo: um preenchimento à esquerda de 2 empurrará o conteúdo da vista 284 em 2 pixels para a direita da borda esquerda. Para definir o preenchimento, usa-se 285 o método {@link android.view.View#setPadding(int, int, int, int)} e consulta-se com as chamadas 286 {@link android.view.View#getPaddingLeft()}, {@link android.view.View#getPaddingTop()}, 287 {@link android.view.View#getPaddingRight()} e {@link android.view.View#getPaddingBottom()}. 288 </p> 289 290 <p> 291 Mesmo que cada vista possa definir um preenchimento, ela não fornece nenhuma compatibilidade 292 com margens. No entanto, os grupos de vistas oferecem essa compatibilidade. Consulte 293 {@link android.view.ViewGroup} 294 e {@link android.view.ViewGroup.MarginLayoutParams} para ver mais informações. 295 </p> 296 297 <p>Para obter mais informações sobre dimensões, consulte 298 <a href="{@docRoot}guide/topics/resources/more-resources.html#Dimension">Valores de dimensões</a>. 299 </p> 300 301 302 303 304 305 306<style type="text/css"> 307div.layout { 308 float:left; 309 width:200px; 310 margin:0 0 20px 20px; 311} 312div.layout.first { 313 margin-left:0; 314 clear:left; 315} 316</style> 317 318 319 320 321<h2 id="CommonLayouts">Layouts comuns</h2> 322 323<p>Cada subclasse da classe {@link android.view.ViewGroup} fornece um modo exclusivo de exibir 324as vistas aninhadas dentro dela. Eis alguns dos tipos de layout mais comuns criados 325na plataforma Android.</p> 326 327<p class="note"><strong>Observação:</strong> Embora seja possível aninhar um ou mais layouts em outro 328layout para obter o projeto de IU, deve-se procurar manter a hierarquia do layout a menos profunda 329possível. O layout carrega mais rápido se tiver menos layouts aninhados (uma hierarquia de vistas grande é 330melhor do que uma hierarquia de vistas profunda).</p> 331 332<!-- 333<h2 id="framelayout">FrameLayout</h2> 334<p>{@link android.widget.FrameLayout FrameLayout} is the simplest type of layout 335object. It's basically a blank space on your screen that you can 336later fill with a single object — for example, a picture that you'll swap in and out. 337All child elements of the FrameLayout are pinned to the top left corner of the screen; you cannot 338specify a different location for a child view. Subsequent child views will simply be drawn over 339previous ones, 340partially or totally obscuring them (unless the newer object is transparent). 341</p> 342--> 343 344 345<div class="layout first"> 346 <h4><a href="layout/linear.html">Layout linear</a></h4> 347 <a href="layout/linear.html"><img src="{@docRoot}images/ui/linearlayout-small.png" alt="" /></a> 348 <p>Layout que organiza os filhos em uma única linha horizontal ou vertical. Ele 349 cria uma barra de rolagem se o comprimento da janela exceder o comprimento da tela.</p> 350</div> 351 352<div class="layout"> 353 <h4><a href="layout/relative.html">Layout relativo</a></h4> 354 <a href="layout/relative.html"><img src="{@docRoot}images/ui/relativelayout-small.png" alt="" /></a> 355 <p>Permite especificar a localização de objetos filhos relativos entre si (filho A 356à esquerda do filho B) ou relativos aos pais (alinhados no topo do pai).</p> 357</div> 358 359<div class="layout"> 360 <h4><a href="{@docRoot}guide/webapps/webview.html">Vista web</a></h4> 361 <a href="{@docRoot}guide/webapps/webview.html"><img src="{@docRoot}images/ui/webview-small.png" alt="" /></a> 362 <p>Exibe páginas da web.</p> 363</div> 364 365 366 367 368<h2 id="AdapterViews" style="clear:left">Criação de layouts com um adaptador</h2> 369 370<p>Quando o conteúdo do layout é dinâmico ou não predeterminado, é possível usar um layout que 371torne {@link android.widget.AdapterView} uma subclasse para preencher o layout com vistas em tempo de execução. 372Uma subclasse da classe {@link android.widget.AdapterView} usa um {@link android.widget.Adapter} 373para agrupar dados ao seu layout. O {@link android.widget.Adapter} se comporta como um intermediário entre a fonte 374dos dados e o layout do {@link android.widget.AdapterView} — o {@link android.widget.Adapter} 375recupera os dados (de uma fonte como uma matriz ou uma consulta de banco de dados) e converte cada entrada 376em uma vista que pode ser adicionada ao layout do {@link android.widget.AdapterView}.</p> 377 378<p>Alguns layouts comuns retornados por um adaptador:</p> 379 380<div class="layout first"> 381 <h4><a href="layout/listview.html">Vista em lista</a></h4> 382 <a href="layout/listview.html"><img src="{@docRoot}images/ui/listview-small.png" alt="" /></a> 383 <p>Exibe uma lista de rolagem de coluna única.</p> 384</div> 385 386<div class="layout"> 387 <h4><a href="layout/gridview.html">Vista em grade</a></h4> 388 <a href="layout/gridview.html"><img src="{@docRoot}images/ui/gridview-small.png" alt="" /></a> 389 <p>Exibe uma grade de rolagem de colunas e linhas.</p> 390</div> 391 392 393 394<h3 id="FillingTheLayout" style="clear:left">Preenchimento da vista de adaptador com dados</h3> 395 396<p>É possível preencher um {@link android.widget.AdapterView} como {@link android.widget.ListView} 397ou {@link android.widget.GridView} agrupando-se a instância do {@link android.widget.AdapterView} 398a um {@link android.widget.Adapter}, o que recupera dados de uma fonte externa e cria uma {@link 399android.view.View} que representa cada entrada de dados.</p> 400 401<p>O Android oferece diversas subclasses de {@link android.widget.Adapter} que são úteis para 402recuperar diferentes tipos de dados e criar vistas de um {@link android.widget.AdapterView}. 403Os dois adaptadores mais comuns são:</p> 404 405<dl> 406 <dt>{@link android.widget.ArrayAdapter}</dt> 407 <dd>Use esse adaptador quando a fonte de dados for uma matriz. Por padrão, {@link 408android.widget.ArrayAdapter} cria uma vista para cada item de matriz chamando {@link 409java.lang.Object#toString()} em cada item e posicionando o conteúdo em uma {@link 410android.widget.TextView}. 411 <p>Por exemplo: se você tiver uma matriz de strings que deseja exibir em uma {@link 412android.widget.ListView}, inicialize um novo {@link android.widget.ArrayAdapter} com 413um construtor para especificar o layout de cada string e a matriz de strings:</p> 414<pre> 415ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 416 android.R.layout.simple_list_item_1, myStringArray); 417</pre> 418<p>Os argumentos desse construtor são:</p> 419<ul> 420 <li>O {@link android.content.Context} do aplicativo</li> 421 <li>O layout que contém uma {@link android.widget.TextView} para cada string na matriz</li> 422 <li>A matriz de strings</li> 423</ul> 424<p>Em seguida, simplesmente chame 425{@link android.widget.ListView#setAdapter setAdapter()} na {@link android.widget.ListView}:</p> 426<pre> 427ListView listView = (ListView) findViewById(R.id.listview); 428listView.setAdapter(adapter); 429</pre> 430 431 <p>Para personalizar a aparência de cada item, é possível suspender o método {@link 432java.lang.Object#toString()} para os objetos na matriz. Ou, para criar uma vista para cada 433item diferente de uma {@link android.widget.TextView} (por exemplo, se você quiser 434uma {@link android.widget.ImageView} para cada item da matriz), estenda a classe {@link 435android.widget.ArrayAdapter} e suspenda {@link android.widget.ArrayAdapter#getView 436getView()} para retornar o tipo de vista que deseja para cada item.</p> 437 438</dd> 439 440 <dt>{@link android.widget.SimpleCursorAdapter}</dt> 441 <dd>Use este adaptador quando os dados vierem de um {@link android.database.Cursor}. 442Ao usar {@link android.widget.SimpleCursorAdapter}, é necessário especificar um layout a usar para cada 443linha no {@link android.database.Cursor} e que colunas no {@link android.database.Cursor} 444devem ser inseridas em determinadas vistas do layout. Por exemplo: se você deseja criar uma lista 445de nome e número de telefone de pessoas, pode-se realizar uma consulta que retorna um {@link 446android.database.Cursor} que contém uma linha para cada pessoa e colunas para os nomes 447e números. Assim, cria-se uma matriz de strings especificando quais colunas do {@link 448android.database.Cursor} estarão no layout para cada resultado e uma matriz de números inteiros especificando 449as vistas correspondentes em que cada coluna deve ser colocada:</p> 450<pre> 451String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, 452 ContactsContract.CommonDataKinds.Phone.NUMBER}; 453int[] toViews = {R.id.display_name, R.id.phone_number}; 454</pre> 455<p>Ao instanciar o {@link android.widget.SimpleCursorAdapter}, passe o layout a usar 456para cada resultado, o {@link android.database.Cursor} contendo os resultados e estas duas matrizes:</p> 457<pre> 458SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 459 R.layout.person_name_and_number, cursor, fromColumns, toViews, 0); 460ListView listView = getListView(); 461listView.setAdapter(adapter); 462</pre> 463<p>Em seguida, o {@link android.widget.SimpleCursorAdapter} cria uma vista de cada linha 464no{@link android.database.Cursor} usando o layout fornecido por meio da inserção de cada item de {@code 465fromColumns} na vista {@code toViews} correspondente.</p>.</dd> 466</dl> 467 468 469<p>Se durante o curso de vida do aplicativo, você mudar os dados subjacentes lidos 470pelo adaptador, chame {@link android.widget.ArrayAdapter#notifyDataSetChanged()}. Isso 471notificará à vista anexada que os dados foram alterados e que ela deve se atualizar.</p> 472 473 474 475<h3 id="HandlingUserSelections">Tratamento de eventos de clique</h3> 476 477<p>Para responder a eventos de clique em cada item em um {@link android.widget.AdapterView}, 478implementa-se a interface {@link android.widget.AdapterView.OnItemClickListener}. Por exemplo:</p> 479 480<pre> 481// Create a message handling object as an anonymous class. 482private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() { 483 public void onItemClick(AdapterView parent, View v, int position, long id) { 484 // Do something in response to the click 485 } 486}; 487 488listView.setOnItemClickListener(mMessageClickedHandler); 489</pre> 490 491 492 493