ListView: Entendendo e Utilizando no Android

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /ListView: Entendendo e Utilizando no Android

ListView: Entendendo e Utilizando no Android

Vinícius Thiengo
(10109) (27)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloCraftsmanship Limpo: Disciplinas, Padrões e ética
CategoriaDesenvolvimento Web
Autor(es)Robert C. Martin
EditoraAlta Books
Edição
Ano2023
Páginas416
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Tudo bem?

Na vídeo aula acima nós vamos, passo a passo, destrinchar um dos principais e primeiros frameworks de lista Android, estamos falando do ListView.

Este que foi por muito tempo o componente visual mais utilizado em aplicativos Android.

Pois era a melhor opção que não implicava o uso obrigatório de uma atividade (ListActivity) ou no uso obrigatório do modelo em "grid" (GridView e GridLayout) ao invés do modelo em "lista vertical".

De qualquer forma, o ListView, apesar de ser um componente de listagem de itens com uma fácil configuração e de fácil personalização.

Diagrama do ListView e seu ArrayAdapter

Apesar disso eu fortemente recomendo que além de conhecer o ListView você também invista tempo para entender e dominar o mais eficiente framework de lista hoje em dia no desenvolvimento Android, o RecyclerView.

RecyclerView que na verdade, já faz alguns anos (este framework foi lançado no Google I/O de 2014, 25 de Junho), é a melhor opção para listar não somente itens em lista, mas também em grid.

Note que quando eu cito o RecyclerView eu não estou de forma alguma descartando a necessidade de também conhecer o ListView.

Pois certamente, ao menos em projetos Android mais antigos, você o encontrará com frequência.

E, já citando a vídeo aula acima, o conteúdo aqui é um "introdutório com o pé direito".

Ou seja, logo depois de finalizar está aula é prudente ao menos assistir em seguida a aula sobre o BaseAdapter do ListView.

Pois é com o BaseAdapter que você desenvolvedor Android trabalha a implementação do padrão ViewHolder nesse framework de lista.

Já liberando um spoiler:

É com este padrão que o consumo de memória do seu aplicativo diminui consideravelmente e os riscos de um vazamento de memória (memory leak) se tornam mínimos.

E... antes que você siga para a aula.

Antes disso, não utilize nem o ListView e nem mesmo o RecyclerView para a lista de preferências de configurações de seu aplicativo.

Caso você precise disso, então utilize o Preferences que é um recurso nativo Android justamente para: listagem de preferências do usuário no aplicativo.

E, novamente, antes que eu me esqueça...

... como estamos neste artigo aula falando de um componente visual, ListView, é prudente lhe informar que o conhecimento e domínio do Material Design Android também é de grande importância.

Antes de finalizar, vou deixar abaixo alguns links de outros artigos do Blog, também com vídeos, que lhe colocarão em dia com o que há de atual no mundo do desenvolvimento Android:

E caso você tenha o desejo de aprender a criar apps Android, ou evoluir nesta área, também com o conteúdo gratuito do Blog, então não deixe de acessar a lista gratuita de estudos em: 

Não esqueça de se inscrever 📫 na lista de e-mails do Blog para receber os conteúdos Android exclusivos, liberados semanalmente... e também em suas versões em PDF (versões em PDF são liberadas somente aos inscritos da lista de e-mails).

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades disponibilizadas em vídeo aula.

Surgindo dúvidas ou dicas, pode colocar abaixo na área de comentários que logo eu lhe retorno.

Obs. : o link para download do projeto apresentado em vídeo se encontra logo abaixo no artigo, na seção "Download".

Abraço.

Eclipse IDE vs Android Studio IDE

Apesar do conteúdo da vídeo aula deste artigo estar utilizando o IDE Eclipse 😱, tudo que é apresentado, tanto a parte teórica quanto a parte prática, é ainda válido nos dias de hoje com o desenvolvimento Android utilizando o Android Studio IDE 😁.

Ou seja, independente da linguagem oficial (Java, Kotlin, C ou C++), IDE ou framework que você esteja utilizando, o conteúdo acima é ainda muito válido.

AndroidX

Apesar do conteúdo sobre o framework de lista ListView ainda estar atual e ser de grande importância para qualquer nível de desenvolvedor Android.

Apesar disso eu também recomendo, assim que finalizado o projeto em sua própria instalação de IDE, que você o migre para o AndroidX.

Algo que pode ser feito com poucos cliques, como apresentado no tutorial a seguir: Migrar para o AndroidX.

Fonte

Documentação oficial Android ListView

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Classe Intent e o Conceito de Pilha em AndroidClasse Intent e o Conceito de Pilha em AndroidAndroid
Entendendo e Utilizando IntentFilter no AndroidEntendendo e Utilizando IntentFilter no AndroidAndroid
Entendendo a Thread Principal de Um App AndroidEntendendo a Thread Principal de Um App AndroidAndroid
Entendendo e Utilizando ListActivity no AndroidEntendendo e Utilizando ListActivity no AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (27)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Marinaa (1) (0)
22/07/2017
Olá Thiengo, tudo bem?

Deu ruim aqui pra mim! :-(

Consegui inserir o botão, mas não dentro da tela de informações como queria, e sim, na listview. Agradeço pelo link que vc me passou, mas estava tudo em inglês, mas li alguns tutoriais em portugues e consegui pegar alguma coisa. Infelizmente, não consegui inserir e fazer funcionar o botão de link na tela de informações para levar diretamente ao site dos jornais.

Estou começando a criar app android, vejo que tenho que estudar mais a respeito. Esse app que te falei peguei como código fonte aberto na Internet. Você pode me ajudar a finalizar esse?

Segue o código que consegui modificar e chegar até o listview e na tela de informações:

No Main Activity:

public class MainActivity extends ListActivity {

private class MeuAdapter extends ArrayAdapter<Jornais> {
private final Context ctx;
private List<Jornais> dados;

public MeuAdapter(Context ctx, List<jornais> dados) {
super(ctx, R.layout.linha, dados);
this.ctx = ctx;
this.dados = dados;
}

public View getView(int p, View v, ViewGroup g) {
LayoutInflater inf = (LayoutInflater)ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inf.inflate(R.layout.linha, g, false);
Jornais plan = dados.get(p);
((ImageView)view.findViewById(R.id.imagem)).setImageResource(jorn.getImagem());
((TextView)view.findViewById(R.id.nome)).setText(jorn.getNome());
return view;
}
}

private List<Jornais> getDados() {
List<Jornais> dados = new ArrayList<Jornais>();
dados.add(new Jornais(this, R.drawable.campinas, R.string.nCampinas, R.string.dCampinas));
dados.add(new Jornais(this, R.drawable.cidadecam, R.string.nCidade, R.string.dCidade));
dados.add(new Jornais(this, R.drawable.correio_camp, R.string.nCorreio, R.string.dCorreio));
dados.add(new Jornais(this, R.drawable.campinashj, R.string.nCampinashj, R.string.dCampinashj));
return dados;
};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    setListAdapter(new MeuAdapter(this, getDados()));
    }
    
    protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l,  v, position, id);
    Jornais jornais = (Jornais)(this.getListAdapter().getItem(position));
    new AlertDialog.Builder(this)
    .setTitle(Jornais.getNome())
    .setMessage(jornais.getDescricao())
    .show();
    }  
}


Na pasta  value, no string.xml:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
    <string name="app_name">Jornais de Campinas</string>
    <string name="listaVazia">Lista está vazia</string>
    <string name="nCampinas">Campinas</string>
    <string name="dCampinas">Não fique sem assunto e saiba com antecedência das últimas notícias e novidades da Grande Cidade de Campinas com o nosso Jornal de Campinas!</string>

...
   </resources>


No layout, tem 2 arquivos, o main.xml (que possui a listview) e outro com nome de linha.xml:

main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android "
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
android:orientation="vertical">
    <ListView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
android:id="@android:id/list" />
<TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/listaVazia"
android:id="@android:id/empty" />
</LinearLayout>


linha.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android "
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
android:orientation="horizontal">
    <ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
android:id="@+id/imagem" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="30sp"
    android:layout_marginLeft="20dp"
android:id="@+id/nome" />
</LinearLayout>
Responder
Vinícius Thiengo (0) (0)
26/07/2017
Marina, tudo bem aqui.

Remova o <Button> de seu layout de linha e ajuste o AlertDialog como o código a seguir:

new AlertDialog.Builder(this)
        .setTitle(jornais.getNome())
        .setMessage(jornais.getDescricao())
        .setPositiveButton(
                "Abrir site",
                new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                Intent i = new Intent(Intent.ACTION_VIEW);
                                i.setData( Uri.parse( jornais.getUrlSite() ) );
                                startActivity(i);
                        }
                })
        .setNegativeButton(
                "Fechar",
                new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                        }
                })
        .show();

Dessa forma conseguirá colocar a abertura do site para funcionar. Ajuste a invocação getUrlSite() para utilizar o método correto de acordo com a classe Jornais.

Abraço.
Responder
MArina (1) (0)
15/07/2017
Olá Thiengo, td bem? Agradeço pelas dicas maravilhosas que vc passou e me deu até uma grande ideia de inserir botão no campo de informações. Vou fazer os ajustes aqui. Mais uma vez, agradeço pela ajuda e pela dica!
Responder
Marina (1) (0)
14/07/2017
Thiengo, gostei do vídeo. Parabéns. Tenho uma dúvida. Como faço para inserir um link de endereço web numa listview?

Estou criando um app que terá link de jornais aqui de minha cidade. Já criei um listview com o nome do jornal (5 ao todo) e quando é clicado no nome do jornal, surge uma tela com informações do jornal clicado.

O que realmente queria, é inserir um link web dentro da tela de informações que levará o usuário para o site do jornal.

As informações de cada jornal inseri no arquivo string.xml. Não estou conseguindo criar link no arquivo string.xml. No arquivo manifest, inseri a permissão internet ("<uses-permission android:name="android.permission.INTERNET"/>").

Nesse caso, como devo proceder?
Responder
Vinícius Thiengo (0) (0)
15/07/2017
Marina, tudo bem?

O que pode fazer é colocar a url do Jornal junto as informações dele, também no /res/values/strings.xml (é possível, pois a url é apenas uma String também) e entra utilizar o Linkify, por exemplo, para ativar o link.

Mais sobre o Linkify no conteúdo a seguir: http://www.thiengo.com.br/linkify-android-entendendo-e-utilizando

Uma outra opção é colocar um Button na tela de informações com um rótulo indicando que se ele for clicado o usuário será encaminhado para o site do jornal.

Esse Button terá um listener de clique vinculado a ele e como conteúdo um Intent acionador do navegador do device para abertura do jornal.

Listener de clique no Button: https://developer.android.com/reference/android/widget/Button.html

Código Intent para abertura de site: https://stackoverflow.com/a/3004542/2578331

A última opção que vejo é abrir o site direto em uma WebView, isso na tela de informações, assim o usuário não terá nem mesmo de clicar em nada.

Links sobre o WebView:

http://www.thiengo.com.br/webview-no-android-entendendo-e-utilizando
http://www.thiengo.com.br/integrando-webview-android-com-javascript-de-uma-webpage
http://www.thiengo.com.br/facilitando-o-desenvolvimento-de-apps-android-com-a-biblioteca-androidutilcode

Essa última opção com WebView é um pouco distante do que você informou que precisa, as outras duas se encaixam melhor. Abraço.
Responder
Edeson (1) (0)
14/06/2017
Olá Thiengo, como faço para obter a ordem correta da playlist de mais de 200 vídeos sobre o Android? Não consigo organizar. Obrigado!
Responder
Vinícius Thiengo (1) (0)
14/06/2017
Edeson, tudo bem?

No Blog crie um artigo com a lista correta de estudo, segue link: http://www.thiengo.com.br/estudando-android-lista-de-conteudos-do-blog

Mas a pouco tempo também comecei os artigos e vídeos sobre o Kotlin, recomendo que os acompanhe também. Os dois já publicados estão abaixo:

http://www.thiengo.com.br/kotlin-android-entendendo-e-primeiro-projeto
http://www.thiengo.com.br/iniciando-com-anko-kotlin-intencoes-no-android

Abraço.
Responder
Edeson (1) (0)
15/06/2017
Obrigado pela sua atenção. Pela qualidade do seu trabalho já percebo que que irei aprende bastante. Muito obrigado mais uma vez!
Responder
08/05/2017
Fala Thiengo conterraneo, tudo certo?
Utilizei as suas dicas aqui e funcionou tudo prefeito no app. Consegui criar uma lisview de materiais que o usuario seleciona com spinner e ele acrescenta certinho com estrutura de BaseAdapter e etc. Agora estou tentando usar mesma logica só que acrescentando imagens selecionadas ou do SDcard ou tirada na hora da camera. Ao adicionar primeira imagem funciona certinho e adiciona no listview ,porem quando tento inserir outra ele acrescenta a nova mas substitui todas as anteriores que tiverem no listview, ele muda não só a imagem mas o texto digitado pelo usuario também.  Eu tentei usar também a ideia do método onActivityResult da Camera para trabalhar com a imagem do livro de Android do Ricardo Lecheta da 5ed para tentar resolver mas nada. poderia me dizer o que é preciso para resolver isso ou se é preciso usar outro tipo especifico de classe?
Responder
Vinícius Thiengo (1) (0)
08/05/2017
Joel, tudo bem aqui.

Não vejo problemas com o uso do ListView, é somente um framework de lista, pode manter utilizando ele.

Quanto ao problema, eu até poderia sinalizar que você não está utilizando o padrão ViewHolder. Caso não esteja, o utilize, isso vai aliviar em muito o problema de vazamento de memória em sua app.

Mas como falou que todas as imagens e textos passam a ser os mesmos, o que muito provavelmente está acontecendo é erro de lógica. Se possível revise todo o trecho de código que é responsável por obter a imagem e colocar em apenas um item da lista.

Esse trecho deve colocar os dados do novo item em um novo objeto e assim adicionar a lista que é vinculada ao adapter do ListView, logo depois invocar o método notifyDataSetChanged() do objeto adapter da lista. Assim deve funcionar.

Abraço.
Responder
09/05/2017
Acertou em cheio mano,tu é o cara. Depois de 4 dias penando e varrendo o stack eu criei uma classe ViewHolder no BaseAdapter achando que não era isso ,para ser utilizado no método getView(), acertei o if de criação do inflate no mesmo método e voilá, funcionou perfeitamente. Valeu mesmo. Agora só acertar a sujeira que ficou de tentativa e erro dos exemplos e comprar seu livro refatorando logo para fazer um upgrade no meu frankstein . kkk Abraço e obrigado. Continue com esse trabalho que é diferencial com certeza.
Responder
Vinícius Thiengo (1) (0)
09/05/2017
Show de bola, Joel. Abraço.
Responder
26/03/2016
apareceu isso no event log do android studio 6:33:48 IncorrectOperationException: Must not modify PSI inside save listener
Responder
Vinícius Thiengo (0) (0)
26/03/2016
Pablo, pesquisei aqui e nada de consistente encontrei, então se possível coloque seu código que tem o listener e o listview (incluindo adapter) no pasteBin (http://pastebin.com/ ) para que eu consiga ver o que está ocorrendo. Abraço
Responder
25/03/2016
thiengo urgente fiz o listview  tudo certo instalei o apk no meu cel abriu,mas quando clico para ir a outra tela aparece que parou
Responder
Vinícius Thiengo (0) (0)
25/03/2016
Fala Pablo, blz?
O que está sendo apresentado no LogCat logo após a APP parar? Se não conhece o LogCat (http://www.thiengo.com.br/entendendo-e-utilizando-o-a-classe-log-com-o-logcat-no-android ). Abraço
Responder
26/03/2016
eu estou usando o android studio
Responder
Andson (1) (0)
27/11/2015
Eae Thiengo tudo tranquilo?
Gostaria de saber como eu criaria um app para exibir as ultimas postagem de um site, onde sempre que fosse postado um conteúdo ele automaticamente iria para o app, é o usuário recebesse um alerta da postagem, você poderia me dizer o que é preciso para fazer isso ou se você já tem algum material que fale sobre isso??
Responder
Vinícius Thiengo (1) (0)
29/11/2015
Fala Andson, blz?
Terá de construir uma APP com as entidades mais comuns, ao menos elas, como Activity, ListView, ImageView, TextView, (https://www.youtube.com/playlist?list=PLBA57K2L2RILUAyMeRmw5kkt4-zzTHv78 )... e entidades de conexão Web, no caso recomendo o Retrofti 2.0 (http://www.thiengo.com.br/library-retrofit-2-no-android ).

Terá de desenvolver tb a parte de notificação e push message para que seu servidor consiga enviar as notificações de novo conteúdo, mas esse tenho bem explicado nessa série (https://www.youtube.com/playlist?list=PLBA57K2L2RII4K3RpWuWsLaCCyPTBb1gw ). Abraço
Responder
Andson (2) (0)
29/11/2015
vlwss Thiengo, vou começar os estudos, muito obrigado brother \õ/

Conheci seu trabalho esses dias, só posso dizer que continue com ele é muito massa, estais de parabéns, esta me ajudando muito.
Responder
Vinícius Thiengo (1) (0)
29/11/2015
Vlw Andson, abraço
Responder
pabllobeg (1) (0)
20/12/2015
ajuda muito obrigado vou ver todos os seus videos
Responder
Oliver (1) (0)
17/08/2015
Fala Thiengo blz? Parabens!

Como faco um Listview igual ao da app do blog? Com uma estrela para classificar os favoritos, tem algum exemplo?

Obrigado
Responder
Vinícius Thiengo (0) (0)
18/08/2015
Fala Oliver, blz sim.
Na verdade no Blog estou utilizando um RecyclerView, a estrela apenas acrescentei ao layout personalizado dos itens do Recycler. Quando há um click nela, acesso o id do objeto que teve os dados carregados naquela posição do RecyclerView e então salvo no bd local (SQLite) se aquele item foi favoritado (quando não era favorito anteriormente) ou o contrário. O icon de estrela peguei no Material Design Icons (https://materialdesignicons.com/ ). Abraço
Responder
Gabriel (1) (0)
04/04/2015
Eae thiengo tudo bem? Estou desenvolvendo um app que é basicamente um livro com imagens e textos porem não tô conseguindo resolver um problema. É basicamente assim tenho um linear layout e dentro dele tenho um imageview e um textview, usei o atributo peso para fazer com que o texto ocupe todo o espaço vazio da tela so que ele ocupa somente o espaço lateral que sobra e não o abaixo da imagem. Você sabe de algum modo do texto ocupar tanto o espaço lateral quanto o espaço inferior da imagem? Ja quebrei a cabeça tentando resolver se souber de um modo me ajudaria muito. Fico no aguardo, abs.
Responder
Vinícius Thiengo (0) (0)
04/04/2015
Fala Gabriel, td bem sim.
Uma forma que veja para solucionar esse problema é utilizar um WebView onde vc carregaria somente conteúdo local (a imagem e o text), logo com HTML no WebView é tranquilo de fazer isso, coloque o <img> dentro de um <div> e faça-o flutuar para o lado que quiser. Dentro do mesmo <div> vc coloca o text e esse comportamento desejado acontece automaticamente. Como o conteúdo será local, o WebView carregará rapidamente. Abraço
Responder
31/01/2015
getBaseContext() muito legal a dica!!! Parabéns e obrigado!
Responder