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 &mdash;
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 &mdash; 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 &mdash; 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&lt;?xml version="1.0" encoding="utf-8"?>
88&lt;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    &lt;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    &lt;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&lt;/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="&#64;+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="&#64;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&lt;Button android:id="&#64;+id/my_button"
165        android:layout_width="wrap_content"
166        android:layout_height="wrap_content"
167        android:text="&#64;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 &mdash; 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} &mdash; 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&lt;String> adapter = new ArrayAdapter&lt;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