ListView: Entendendo e Utilizando no Android

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog. Você receberá um email de confirmação. Somente depois de confirma-lo é que poderei lhe enviar os conteúdos exclusivos.

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

ListView: Entendendo e Utilizando no Android

Vinícius Thiengo15/12/2013
(4891) (27) (3) (2)
Go-ahead
"Na falta de um foco externo, a mente se volta para dentro de si mesma e cria problemas para resolver, mesmo que os problemas são indefinidos ou sem importância. Se você encontrar um foco, uma meta ambiciosa que parece impossível e força-o a crescer, essas dúvidas desaparecem."
Tim Ferriss
Treinamento Oficial
Android: Prototipagem Profissional de Aplicativos
Black Week
CursoAndroid: Prototipagem Profissional de Aplicativos
CategoriaAndroid
InstrutorVinícius Thiengo
NívelTodos os níveis
Vídeo aulas+ 124
PlataformaUdemy
Acessar Curso
Receitas Android
Capa do livro Receitas Para Desenvolvedores Android
TítuloReceitas Para Desenvolvedores Android
CategoriaDesenvolvimento Android
AutorVinícius Thiengo
Edição
Ano2017
Capítulos20
Páginas934
Acessar Livro
Código Limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Ano2017
Capítulos46
Páginas598
Acessar Livro
Conteúdo Exclusivo
Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
Email inválido

Opa! Blz?!

Nesse vídeo mostro o que é e como utilizar o componente ListView no Android. Quais as vantagens dele diante a classe ListActivity e porque sempre utilizar ListView ao invés de ListActivity.

Quero ressaltar que a ListActivity é uma classe que herda de Activity e implementa internamente uma ListView que oculpa todo a tela do smartphone ou tablet. Já a ListView herda de View é mais personalizável, permitindo que vários outros componentes sejam utilizados na mesma tela em que se encontra a ListView. Claro que com ListActivity também é possível usar outros componentes na tela, porém essa técnica entraria no conceito de Fragments que é assunto para outro post e tem a intenção de ajudar em muitas outras coisas ao onvés de criar uma gambiarra para utilizar a ListView da ListActivity juntamente com outros componentes de tela.

Mas enfim, vou evitar mais delongas e deixar você assistir ao vídeo.

O link para download do projeto se encontra logo abaixo no post.

Compartilhe, comente! Vlw.

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
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 Uma APP AndroidEntendendo a Thread Principal de Uma 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)
16/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)
26/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)
18/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)
05/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)
05/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