Ver mensagens sem resposta | Ver tópicos ativos Hoje é 22 Nov 2017, 10:03



Responder Tópico  [ 29 Mensagens ] 
 Otimizando um adapter listView com padrão ViewHolder 
Autor Mensagem
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Otimizando um adapter listView com padrão ViewHolder
Opa galera... esse é meu primeiro tutorial, espero que não seja repetido(procurei mas não encontrei...) é algo muito simples mas além de eu usar muito e ver muitas perguntas a respeito de como popular um listview ele deixa o adaptador do listview muito mais eficiente. Como exemplo criei uma lista que mostra o nome do guitarrista e sua banda. Show me the code!

Primeiro passo criei uma classe Artista, para armazenar os itens para lista:
public class Artista {
   
    private String nome;
    private String banda;
   
    public Artista(String nome, String banda){
        this.nome = nome;
        this.banda = banda;
    }
   
    public String getBanda() {
        return banda;
    }
    public void setBanda(String banda) {
        this.banda = banda;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }


Depois criei a Activity que vai mostrar essa lista:
public class ExemploViewHolder extends Activity {
   
    private ArrayList<Artista> artistas = new ArrayList<Artista>();
    private ListView listaArtistas;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        atribuiViews();
        criaArtistas();
        adaptaArtistas();
    }

    private void adaptaArtistas() {
        AdapterArtista adaptadorArtistas = new AdapterArtista(this, artistas);
        listaArtistas.setAdapter(adaptadorArtistas);
    }

    private void criaArtistas() {
        Artista slash = new Artista("Slash", "Guns n Roses");
        artistas.add(slash);
        Artista murray = new Artista("Dave Murray", "Iron Maiden");
        artistas.add(murray);
        Artista hammet = new Artista("Kirk Hammet", "Metallica");
        artistas.add(hammet);
        Artista chimbinha = new Artista("Chimbinha", "Calipso");
        artistas.add(chimbinha);
       
    }

    private void atribuiViews() {
        listaArtistas = (ListView) findViewById(R.id.listViewArtistas);
    }


O main.xml fica assim:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >


        <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >


            <TableRow
                android:id="@+id/tableRow1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >


                <TextView
                    android:layout_weight="1"
                    android:id="@+id/textView1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/guitarrista"
                    android:textAppearance="?android:attr/textAppearanceLarge" />


                <TextView
                    android:layout_weight="1"
                    android:id="@+id/textView2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/banda"
                    android:textAppearance="?android:attr/textAppearanceLarge" />


            </TableRow>

        </TableLayout>
       
        <ListView
            android:id="@+id/listViewArtistas"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" >

        </ListView>

    </LinearLayout>
 


Lembrando que a parte acima do listView está sendo usado como cabeçalho, e você pode inserir esse listView em qualquer parte do seu layout, só preservando esses atributos.

Agora entra o adaptador usando viewHolder da lista:

public class AdapterArtista extends ArrayAdapter<Artista>{
   
    private ArrayList<Artista> artistas;
   
    public AdapterArtista(Context context, ArrayList<Artista> artistas){
        super(context, R.layout.main, artistas);
        this.artistas = artistas;
    }

    public int getCount() {
        return artistas.size();
    }

    public Artista getItem(int posicao) {
        return artistas.get(posicao);
    }

    public long getItemId(int posicao) {
        return posicao;
    }

    @Override
    public View getView(int posicao, View convertView, ViewGroup viewGroup) {
       
        View view = convertView;
        ArtistaViewHolder artistaVH;
               
            if(naoExisteView(view)){
                LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
                        Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.linha_artista, viewGroup, false);
                artistaVH = new ArtistaViewHolder();
                artistaVH.textGuitarrista = (TextView) view.findViewById(R.id.textViewGuitarrista);
                artistaVH.textBanda = (TextView) view.findViewById(R.id.textViewBanda);
                view.setTag(artistaVH);
           }else{
                   artistaVH = (ArtistaViewHolder) view.getTag();
           }

        Artista artista = artistas.get(posicao);
       
        if(existeArtista(artista)){
            artistaVH = (ArtistaViewHolder) view.getTag();
            artistaVH.textGuitarrista.setText(artista.getNome());
            artistaVH.textBanda.setText(artista.getBanda());
        }
        return view;
    }

    private boolean naoExisteView(View view) {
        return view == null;
    }

    private boolean existeArtista(Artista artista) {
        return artista != null;
    }
   
//ViewHolder que evita criar os textView para todos os itens da lista, por isso a otimização
    static class ArtistaViewHolder{
        TextView textGuitarrista;
        TextView textBanda;
    }


Agora o linha_artista.xml q será usado pelo viewHolder:
<?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="match_parent"
    android:orientation="vertical" >

   
    <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >


            <TableRow
                android:id="@+id/tableRow1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >


                <TextView
                    android:layout_weight="0.6"
                    android:id="@+id/textViewGuitarrista"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>


                <TextView
                    android:gravity="center_horizontal"
                    android:layout_weight="0.4"
                    android:layout_marginLeft="10dp"
                    android:id="@+id/textViewBanda"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />


            </TableRow>

        </TableLayout>
   

</LinearLayout>


É isso galera... espero que ajude algúem! Abraços!

_________________
Powell


Editado pela última vez por raphaelframos em 15 Abr 2013, 13:00, no total de 4 vez



28 Out 2012, 18:24
Perfil
Application Life Cycle
Application Life Cycle
Avatar de usuário

Data de registro: 08 Ago 2011, 16:21
Mensagens: 226
Localização: Ponta Grossa - PR / Blumenau - SC
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
raphaelframos,

Não sei se isso seria uma boa prática, pois deve existir uma razão para a API do Android ser assim.

Vamos exagerar um pouco, jogue 2000 registros dentro dessa sua lista de artistas, o que vai acontecer??

Se o aparelho for limitado na memória ram?? Acho que você terá problemas.

Na minha opinião você deve deixar o android reconstruir essas views.... afinal você ja tem os dados no list dentro do adapter.

_________________
Eu te ajudei? Quer agradecer? Não precisa nem postar no tópico agradecendo, você me ajudaria muito entrando em um dos meus blogs, comentando e compartilhando os posts nas redes sociais.
Blog: Cedulio Cezar- Tutoriais e dicas voltados para o desenvolvimento de softwares em Java e Android.
Blog: Pedreiros do Software - Tutoriais sobre Java, Android, Banco de dados, Arquitetura, JSF.

App: ThinkTwice - Aplicativo que auxilia no aprendizado de outros idiomas.
App: InstantGilGomes- Aplicativo de humor com bordões clássicos do ilustre Gil Gomes.


09 Nov 2012, 16:44
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
ByddU escreveu:
raphaelframos,

Não sei se isso seria uma boa prática, pois deve existir uma razão para a API do Android ser assim.

Vamos exagerar um pouco, jogue 2000 registros dentro dessa sua lista de artistas, o que vai acontecer??

Se o aparelho for limitado na memória ram?? Acho que você terá problemas.

Na minha opinião você deve deixar o android reconstruir essas views.... afinal você ja tem os dados no list dentro do adapter.

Muito pelo contrário, essa é uma prática recomendada pelo pessoal de desenvolvimento da própria Google. A otimização consiste justamente em reaproveitar as views já criadas e não criá-las toda vez. Note que uma listView mostra umas poucas views de cada vez, sendo que o número de itens muito maior, então com o reproveitamento das views quando elas saem da parte visível é que dá um enorme ganho de performance.
Com o uso da viewHolder esse ganho é aumentado por guardar as referencias aos componentes da view do listView.

raphaelframos, parabéns pelo tutorial!

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


10 Nov 2012, 00:07
Perfil
Application Life Cycle
Application Life Cycle
Avatar de usuário

Data de registro: 08 Ago 2011, 16:21
Mensagens: 226
Localização: Ponta Grossa - PR / Blumenau - SC
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
A H Gusukuma escreveu:
ByddU escreveu:
raphaelframos,

Não sei se isso seria uma boa prática, pois deve existir uma razão para a API do Android ser assim.

Vamos exagerar um pouco, jogue 2000 registros dentro dessa sua lista de artistas, o que vai acontecer??

Se o aparelho for limitado na memória ram?? Acho que você terá problemas.

Na minha opinião você deve deixar o android reconstruir essas views.... afinal você ja tem os dados no list dentro do adapter.

Muito pelo contrário, essa é uma prática recomendada pelo pessoal de desenvolvimento da própria Google. A otimização consiste justamente em reaproveitar as views já criadas e não criá-las toda vez. Note que uma listView mostra umas poucas views de cada vez, sendo que o número de itens muito maior, então com o reproveitamento das views quando elas saem da parte visível é que dá um enorme ganho de performance.
Com o uso da viewHolder esse ganho é aumentado por guardar as referencias aos componentes da view do listView.

raphaelframos, parabéns pelo tutorial!


Sim, que vai otimizar a a apresentação das views dentro do ListView isso está claro. Eu tambem ja utilizei esse padrão.
O Meu questionamento na verdade não é se vai deixar ou não mais rápido, e sim problemas de memória ao carregar algumas centenas de registros.

Pense que você ja possui referência a esses dados dentro do adapter no private ArrayList<Artista> artistas, você terá mais memória sendo utlizada.

A H Gusukuma já que você citou que é uma recomendação do desenvolvimento da Google, pode por favor citar a fonte? Quero dar uma olhada.

_________________
Eu te ajudei? Quer agradecer? Não precisa nem postar no tópico agradecendo, você me ajudaria muito entrando em um dos meus blogs, comentando e compartilhando os posts nas redes sociais.
Blog: Cedulio Cezar- Tutoriais e dicas voltados para o desenvolvimento de softwares em Java e Android.
Blog: Pedreiros do Software - Tutoriais sobre Java, Android, Banco de dados, Arquitetura, JSF.

App: ThinkTwice - Aplicativo que auxilia no aprendizado de outros idiomas.
App: InstantGilGomes- Aplicativo de humor com bordões clássicos do ilustre Gil Gomes.


10 Nov 2012, 11:24
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
ByddU escreveu:
A H Gusukuma escreveu:
ByddU escreveu:
raphaelframos,

Não sei se isso seria uma boa prática, pois deve existir uma razão para a API do Android ser assim.

Vamos exagerar um pouco, jogue 2000 registros dentro dessa sua lista de artistas, o que vai acontecer??

Se o aparelho for limitado na memória ram?? Acho que você terá problemas.

Na minha opinião você deve deixar o android reconstruir essas views.... afinal você ja tem os dados no list dentro do adapter.

Muito pelo contrário, essa é uma prática recomendada pelo pessoal de desenvolvimento da própria Google. A otimização consiste justamente em reaproveitar as views já criadas e não criá-las toda vez. Note que uma listView mostra umas poucas views de cada vez, sendo que o número de itens muito maior, então com o reproveitamento das views quando elas saem da parte visível é que dá um enorme ganho de performance.
Com o uso da viewHolder esse ganho é aumentado por guardar as referencias aos componentes da view do listView.

raphaelframos, parabéns pelo tutorial!


Sim, que vai otimizar a a apresentação das views dentro do ListView isso está claro. Eu tambem ja utilizei esse padrão.
O Meu questionamento na verdade não é se vai deixar ou não mais rápido, e sim problemas de memória ao carregar algumas centenas de registros.

Pense que você ja possui referência a esses dados dentro do adapter no private ArrayList<Artista> artistas, você terá mais memória sendo utlizada.

A H Gusukuma já que você citou que é uma recomendação do desenvolvimento da Google, pode por favor citar a fonte? Quero dar uma olhada.


Limitação de memória sempre pode ocorrer, mas, isso independe da técnica utilizada.
Veja view holder: http://developer.android.com/training/i ... ViewHolder

Tem um video de uma apresentação sobre isso, mas eu não consegui localizar.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


10 Nov 2012, 13:09
Perfil
Google employee
Google employee
Avatar de usuário

Data de registro: 05 Abr 2011, 04:47
Mensagens: 1968
Localização: Rio de Janeiro
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
ByddU escreveu:
A H Gusukuma escreveu:
ByddU escreveu:
raphaelframos,

Não sei se isso seria uma boa prática, pois deve existir uma razão para a API do Android ser assim.

Vamos exagerar um pouco, jogue 2000 registros dentro dessa sua lista de artistas, o que vai acontecer??

Se o aparelho for limitado na memória ram?? Acho que você terá problemas.

Na minha opinião você deve deixar o android reconstruir essas views.... afinal você ja tem os dados no list dentro do adapter.

Muito pelo contrário, essa é uma prática recomendada pelo pessoal de desenvolvimento da própria Google. A otimização consiste justamente em reaproveitar as views já criadas e não criá-las toda vez. Note que uma listView mostra umas poucas views de cada vez, sendo que o número de itens muito maior, então com o reproveitamento das views quando elas saem da parte visível é que dá um enorme ganho de performance.
Com o uso da viewHolder esse ganho é aumentado por guardar as referencias aos componentes da view do listView.

raphaelframos, parabéns pelo tutorial!


Sim, que vai otimizar a a apresentação das views dentro do ListView isso está claro. Eu tambem ja utilizei esse padrão.
O Meu questionamento na verdade não é se vai deixar ou não mais rápido, e sim problemas de memória ao carregar algumas centenas de registros.

Pense que você ja possui referência a esses dados dentro do adapter no private ArrayList<Artista> artistas, você terá mais memória sendo utlizada.

A H Gusukuma já que você citou que é uma recomendação do desenvolvimento da Google, pode por favor citar a fonte? Quero dar uma olhada.


Só acrescentando o que o Gusukuma falou e ajudando a responder a sua pergunta...

Imagine que se vc não usar o ViewHolder, vc terá, além de dados repetidos no seu ArrayList e em views que compõem a ListView, terá várias view dessas repetidas e sem referência "largadas" por toda memória, esperando o GC passar para limpar. Em paralelo, o seu adapter estará gerando mais dessas views, sempre que o usuário movimentar essa ListView, que perderão sua referências quando elas saírem do espaço que aparece na tela.

Agora pense... será que não é melhor guardar essas referências para usar novamente ou será melhor ir instanciando views e largá-las "soltas" pela memória??

Que isso pode deixá-lo com problema de falta de memória, sim, mas da outra forma também te deixará, e ainda mais rápido.

Agora o nosso papel como desenvolvedor é achar uma solução para isso!! =D

Abraços!

_________________
Alexandre Antunes
@a3b @bemobi
Moto X

App@Bemobi: Apps Club - Loja de Apps baseada em assinatura que dá direito a usar ~400 Apps.

Campanha: Facilite sua vida e a dos outros usuários.
Objetivo: Vamos colocar a tag [RESOLVIDO] no título do tópico quando o problema for resolvido.


Use a ferramenta de busca do fórum e não espere tanto para que a sua dúvida seja respondida!

Quer trabalhar comigo??


10 Nov 2012, 14:59
Perfil WWW
Application Life Cycle
Application Life Cycle
Avatar de usuário

Data de registro: 08 Ago 2011, 16:21
Mensagens: 226
Localização: Ponta Grossa - PR / Blumenau - SC
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
A idéia é essa na verdade, se você não está mais referenciando o objeto no seu programa o garbage collector pode ir la e fazer a limpa quando precisar de mais memória.

Agora com esse viewholder elas sempre estarão referenciadas, se o aparelho precisar de mais memória e o gc for ativado o que restará?? RIP android?

Acredito que essa seja uma solução a curto prazo, digamos que para listas com pequenas quantidades de views sendo criadas.

Isso otimiza a exibição, mas te traz alguns problemas, é bom debater isso aqui para se alguem desavisado utilizar essa estratégia sem pensar, pode vir a ter problemas dependendo da aplicação.

_________________
Eu te ajudei? Quer agradecer? Não precisa nem postar no tópico agradecendo, você me ajudaria muito entrando em um dos meus blogs, comentando e compartilhando os posts nas redes sociais.
Blog: Cedulio Cezar- Tutoriais e dicas voltados para o desenvolvimento de softwares em Java e Android.
Blog: Pedreiros do Software - Tutoriais sobre Java, Android, Banco de dados, Arquitetura, JSF.

App: ThinkTwice - Aplicativo que auxilia no aprendizado de outros idiomas.
App: InstantGilGomes- Aplicativo de humor com bordões clássicos do ilustre Gil Gomes.


16 Nov 2012, 15:52
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
ByddU escreveu:
A idéia é essa na verdade, se você não está mais referenciando o objeto no seu programa o garbage collector pode ir la e fazer a limpa quando precisar de mais memória.

Agora com esse viewholder elas sempre estarão referenciadas, se o aparelho precisar de mais memória e o gc for ativado o que restará?? RIP android?

Acredito que essa seja uma solução a curto prazo, digamos que para listas com pequenas quantidades de views sendo criadas.

Isso otimiza a exibição, mas te traz alguns problemas, é bom debater isso aqui para se alguem desavisado utilizar essa estratégia sem pensar, pode vir a ter problemas dependendo da aplicação.


Acho que você não está entendendo o processo. Reaproveitamento da view é padrão do ListView.
Você estará criando overhead se não reaproveitar e criar novas views.
O padrão ViewHolder é outra coisa. É guardar os endereços das views num objeto que será guardado dentro da viewGroup.
Estamos falando de algumas cópias apenas, isso com certeza não vai afetar a memória, isso independe do número de itens totais do listView.
Agora o ganho em performance é perceptivel, principalmente quando o número de elementos for grande.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


16 Nov 2012, 16:28
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Acho que não consegui ser claro na explicação.
Imagine que a sua ListView tenha X linhas visíveis, quando o usuário scrollar para a próxima linha, ou seja, a linha X+1, uma view ficará invisível sendo liberada para reaproveitamento.
Por isso, no adapter, é checado se o convertView é nulo ou não. Se não for, é uma view para ser reutilizada.
Então, ao reutilizar uma view já existente, vamos criar apenas views novas em aproximadamente X+1. (Esse aproximadamente se deve ao tempo em que uma view se torna invisível e é liberada para reuso).
Agora o ViewHolder é utilizado nessas views para guardar as referências aos componetes da linha da listView para não ter que fazer o findViewById em cada ocorrência da list da listView. (Na verdade, se numa linha tem n views, o total seria n*total de itens scrollado pelo usuário).
Melhorou?

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


16 Nov 2012, 18:26
Perfil
Application Life Cycle
Application Life Cycle
Avatar de usuário

Data de registro: 08 Ago 2011, 16:21
Mensagens: 226
Localização: Ponta Grossa - PR / Blumenau - SC
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
A H Gusukuma escreveu:
Acho que não consegui ser claro na explicação.
Imagine que a sua ListView tenha X linhas visíveis, quando o usuário scrollar para a próxima linha, ou seja, a linha X+1, uma view ficará invisível sendo liberada para reaproveitamento.
Por isso, no adapter, é checado se o convertView é nulo ou não. Se não for, é uma view para ser reutilizada.
Então, ao reutilizar uma view já existente, vamos criar apenas views novas em aproximadamente X+1. (Esse aproximadamente se deve ao tempo em que uma view se torna invisível e é liberada para reuso).
Agora o ViewHolder é utilizado nessas views para guardar as referências aos componetes da linha da listView para não ter que fazer o findViewById em cada ocorrência da list da listView. (Na verdade, se numa linha tem n views, o total seria n*total de itens scrollado pelo usuário).
Melhorou?


Opa eu ja tinha entendido na sua explicação anterior, realmente dessa forma essa viewholder ajuda em muito.

Acabei fazendo essa confusão pois uma vez eu vi em algum lugar, que o indivíduo criava as views e salvava todas no viewholder, e depois só reutilizava.

Ou seja quando o usuário chegasse ao fim do listview ele teria todas as posições salvas no viewholder, essa abordagens de vocês é inteligente.

Se vocês quiserem remover esses posts acho que seria melhor, pois a solução é muito válida e não traz problemas de memória como eu citei no exemplo acima.

_________________
Eu te ajudei? Quer agradecer? Não precisa nem postar no tópico agradecendo, você me ajudaria muito entrando em um dos meus blogs, comentando e compartilhando os posts nas redes sociais.
Blog: Cedulio Cezar- Tutoriais e dicas voltados para o desenvolvimento de softwares em Java e Android.
Blog: Pedreiros do Software - Tutoriais sobre Java, Android, Banco de dados, Arquitetura, JSF.

App: ThinkTwice - Aplicativo que auxilia no aprendizado de outros idiomas.
App: InstantGilGomes- Aplicativo de humor com bordões clássicos do ilustre Gil Gomes.


16 Nov 2012, 20:08
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
ByddU escreveu:
A H Gusukuma escreveu:
Acho que não consegui ser claro na explicação.
Imagine que a sua ListView tenha X linhas visíveis, quando o usuário scrollar para a próxima linha, ou seja, a linha X+1, uma view ficará invisível sendo liberada para reaproveitamento.
Por isso, no adapter, é checado se o convertView é nulo ou não. Se não for, é uma view para ser reutilizada.
Então, ao reutilizar uma view já existente, vamos criar apenas views novas em aproximadamente X+1. (Esse aproximadamente se deve ao tempo em que uma view se torna invisível e é liberada para reuso).
Agora o ViewHolder é utilizado nessas views para guardar as referências aos componetes da linha da listView para não ter que fazer o findViewById em cada ocorrência da list da listView. (Na verdade, se numa linha tem n views, o total seria n*total de itens scrollado pelo usuário).
Melhorou?


Opa eu ja tinha entendido na sua explicação anterior, realmente dessa forma essa viewholder ajuda em muito.

Acabei fazendo essa confusão pois uma vez eu vi em algum lugar, que o indivíduo criava as views e salvava todas no viewholder, e depois só reutilizava.

Ou seja quando o usuário chegasse ao fim do listview ele teria todas as posições salvas no viewholder, essa abordagens de vocês é inteligente.

Se vocês quiserem remover esses posts acho que seria melhor, pois a solução é muito válida e não traz problemas de memória como eu citei no exemplo acima.


Por mim, os comentários podem ficar. Não atrapalham e ajudam a esclarecer.
Este tipo de preocupação não teria muito sentido se fosse em Java padrão Sun-Oracle, mas é pertinente em Java for Android!

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


17 Nov 2012, 03:55
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Agora, voltando ao tutorial.
raphaelframos, duas sugestões:
1. Extenda de BaseAdapter.
2. Já que estamos falando em otimização, coloca essa linha no construtor:

private LayoutInflater inflater;
...
// no construtor
 inflater = (LayoutInflater) context.getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


17 Nov 2012, 04:01
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Opa! Perdi o debate... fiquei atarefado aqui! Gusukuma sugestão mais que aceita, em casa eu mudo :D.

Em relação a uma lista com milhares de elementos, a melhora é visível com o padrão, tenho uma lista com 3k de produtos que com o padrão e paginando ficou bem legal. Vlw moçada!

_________________
Powell


19 Nov 2012, 15:34
Perfil
Widgets
Widgets

Data de registro: 13 Abr 2011, 18:37
Mensagens: 383
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Super interessante esse tutorial. Eu até hj rsrsrs fazia da outra forma, que era extender o BaseAdapter e toda vez q entra no getView eu faço o findViewById. Gostei bem dessa forma, devo alterar no meu projeto pois tenho 5 telas hj que usa esse recurso do listview. Agora queria tirar apenas uma dúvida.

Como o ViewHolder é uma classe static, gostaria de saber apenas 1 coisa. Quando finalizar o Activity(fechando a tela de listagem dos itens com o comando finish()) a memória é liberada? Tipo como são varias instancias ele irá liberar a memória? Pois digo isso pelo fato que tenho 500 clientes ae saio do tela deles e vou na tela de lista de produtos. Nesse caso não irá aumentar o gasto de memória não?

_________________
Inux Sistemas: http://www.inux.com.br
Inux Sistemas FaceBook: http://www.facebook.com/pages/Inux-Sist ... 1175085481
E-mail: contato@inux.com.br
Skype: garekx
E-mail pessoal: victor_apc@yahoo.com.br

Calculadora IMC: https://play.google.com/store/apps/deta ... 3JhaW1jIl0.

Gerador e Validador de CPF e CNPJ: https://play.google.com/store/apps/deta ... f&hl=pt_BR

Desenvolvimento de aplicativos e Sistemas Android, Web e sistemas Desktops.


19 Nov 2012, 18:30
Perfil WWW
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
victorapc escreveu:
Super interessante esse tutorial. Eu até hj rsrsrs fazia da outra forma, que era extender o BaseAdapter e toda vez q entra no getView eu faço o findViewById. Gostei bem dessa forma, devo alterar no meu projeto pois tenho 5 telas hj que usa esse recurso do listview. Agora queria tirar apenas uma dúvida.

Como o ViewHolder é uma classe static, gostaria de saber apenas 1 coisa. Quando finalizar o Activity(fechando a tela de listagem dos itens com o comando finish()) a memória é liberada? Tipo como são varias instancias ele irá liberar a memória? Pois digo isso pelo fato que tenho 500 clientes ae saio do tela deles e vou na tela de lista de produtos. Nesse caso não irá aumentar o gasto de memória não?


Olá victorapc
A memória deve ser liberada normalmente. ViewHolder é uma Static Nested Class e o comportamento dela é semelhante a uma classe normal.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


20 Nov 2012, 08:09
Perfil
Widgets
Widgets

Data de registro: 13 Abr 2011, 18:37
Mensagens: 383
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Obrigado pela resposta A H Gusukuma, sua resposta foi bem importante para minha dúvida. Irei fazer as modificações no planejamento do sistema e vou adotar esse tutorial como exemplo para minha aplicação. Muito obrigado pelo tutorial raphaelframos, parabéns.

Obrigado a todos.

_________________
Inux Sistemas: http://www.inux.com.br
Inux Sistemas FaceBook: http://www.facebook.com/pages/Inux-Sist ... 1175085481
E-mail: contato@inux.com.br
Skype: garekx
E-mail pessoal: victor_apc@yahoo.com.br

Calculadora IMC: https://play.google.com/store/apps/deta ... 3JhaW1jIl0.

Gerador e Validador de CPF e CNPJ: https://play.google.com/store/apps/deta ... f&hl=pt_BR

Desenvolvimento de aplicativos e Sistemas Android, Web e sistemas Desktops.


20 Nov 2012, 09:42
Perfil WWW
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Que bom que te ajudou victor!
Gusukuma eu mudei o LayoutInflater, em relação ao BaseAdapter, fiquei em duvida, eu uso o ArrayAdapter, pq eu geralmente pagino o listview, então uso o adaptador.add e adaptador.clear, e com baseAdapter não encontrei uma solução. A diferença no desepenho é grande mesmo? Vlw

_________________
Powell


20 Nov 2012, 17:07
Perfil
Widgets
Widgets

Data de registro: 13 Abr 2011, 18:37
Mensagens: 383
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Não sei se posso colocar aqui, mas, aconteceu um BUG comigo nesse tutorial.
Eu sempre mudo a cor alternadas entre os itens na lista. Esse bug só acontece em rotação paisagem. Qnd fico usando scroll pra cima e para baixo as cores endoidam, tipo ficam 2 brancas e as vezes 3 cinzas ou 2 cinzas, em modo retrato fica de boa. Vcs sabem o q ta acontecendo? Será q errei alguma coisa no processo?

_________________
Inux Sistemas: http://www.inux.com.br
Inux Sistemas FaceBook: http://www.facebook.com/pages/Inux-Sist ... 1175085481
E-mail: contato@inux.com.br
Skype: garekx
E-mail pessoal: victor_apc@yahoo.com.br

Calculadora IMC: https://play.google.com/store/apps/deta ... 3JhaW1jIl0.

Gerador e Validador de CPF e CNPJ: https://play.google.com/store/apps/deta ... f&hl=pt_BR

Desenvolvimento de aplicativos e Sistemas Android, Web e sistemas Desktops.


21 Nov 2012, 00:15
Perfil WWW
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
raphaelframos escreveu:
Que bom que te ajudou victor!
Gusukuma eu mudei o LayoutInflater, em relação ao BaseAdapter, fiquei em duvida, eu uso o ArrayAdapter, pq eu geralmente pagino o listview, então uso o adaptador.add e adaptador.clear, e com baseAdapter não encontrei uma solução. A diferença no desepenho é grande mesmo? Vlw


Se usa algum recurso do ArrayAdapter pode deixar assim mesmo.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


21 Nov 2012, 05:57
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
victorapc escreveu:
Não sei se posso colocar aqui, mas, aconteceu um BUG comigo nesse tutorial.
Eu sempre mudo a cor alternadas entre os itens na lista. Esse bug só acontece em rotação paisagem. Qnd fico usando scroll pra cima e para baixo as cores endoidam, tipo ficam 2 brancas e as vezes 3 cinzas ou 2 cinzas, em modo retrato fica de boa. Vcs sabem o q ta acontecendo? Será q errei alguma coisa no processo?


Posta o getView do adapter, por favor.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


21 Nov 2012, 06:01
Perfil
Widgets
Widgets

Data de registro: 13 Abr 2011, 18:37
Mensagens: 383
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder

/**
     * Classe responsável em definir o layout da lista de mensagem.
     * @author iNux Sistemas
     *
     */

    private class MensagemAdapter extends BaseAdapter{
        private Context ctx;
        private ArrayList<Mensagem> arMensagem;
        private int tamanhoFonte;
        private LayoutInflater inflater;n
       
        /**
         * Método construtor.<p>
         * @param ctx Passar por parâmetro o contexto da classe atual.
         * @param arMensagem Passar por parâmetro um arraylist do tipo mensagem.
         * @param tamanhoFonte Passar o tamanho da fonte.
         */

        public MensagemAdapter(Context ctx, ArrayList<Mensagem> arMensagem, int tamanhoFonte){
            inflater = (LayoutInflater) ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE);
            this.ctx = ctx;
            this.arMensagem = arMensagem;
            this.tamanhoFonte = tamanhoFonte;
        }
       
        public int getCount() {
            return arMensagem.size();
        }

        public Object getItem(int position) {
            return arMensagem.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            MensagensViewHolder msnVH = null;
           
            Mensagem mensagem = arMensagem.get(position);
           
            if(naoExisteView(view)){
                view = inflater.inflate(R.layout.inflater_lista_mensagem, parent, false);
               
                msnVH = new MensagensViewHolder();
                //ID do layout.
                msnVH.lay = (LinearLayout) view.findViewById(R.id.lay_Inf_Mensagens);
                //Remetente.
                msnVH.txtInfMenTiRemetente = (TextView) view.findViewById(R.id.txt_InfMen_TiRemetente);
                msnVH.txtInfMenTiRemetente.setText("Remetente:");
                msnVH.txtInfMenTiRemetente.setTextSize(tamanhoFonte);
               
                msnVH.txtInfMenRemetente = (TextView) view.findViewById(R.id.txt_InfMen_Remetente);
                msnVH.txtInfMenRemetente.setTextSize(tamanhoFonte);
                //Assunto.
                msnVH.txtInfMenTiAssunto = (TextView) view.findViewById(R.id.txt_InfMen_TiAssunto);
                msnVH.txtInfMenTiAssunto.setText("Assunto:");
                msnVH.txtInfMenTiAssunto.setTextSize(tamanhoFonte);
               
                msnVH.txtInfMenAssunto = (TextView) view.findViewById(R.id.txt_InfMen_Assunto);
                msnVH.txtInfMenAssunto.setTextSize(tamanhoFonte);
                //Data e Hora.
                msnVH.txtInfMenTiDataHora = (TextView) view.findViewById(R.id.txt_InfMen_TiDataHora);
                msnVH.txtInfMenTiDataHora.setText("Data/Hora:");
                msnVH.txtInfMenTiDataHora.setTextSize(tamanhoFonte);
               
                msnVH.txtInfMenDataHora = (TextView) view.findViewById(R.id.txt_InfMen_DataHora);
                msnVH.txtInfMenDataHora.setTextSize(tamanhoFonte);
                //Mensagem lida.
                msnVH.txtInfMenTiLida = (TextView) view.findViewById(R.id.txt_InfMen_TiLida);
                msnVH.txtInfMenTiLida.setText("Lida:");
                msnVH.txtInfMenTiLida.setTextSize(tamanhoFonte);
               
                msnVH.txtInfMenLida = (TextView) view.findViewById(R.id.txt_InfMen_Lida);
                msnVH.txtInfMenLida.setTextSize(tamanhoFonte);
               
                view.setTag(msnVH);
            }else{
                msnVH = (MensagensViewHolder) view.getTag();
               
            }
           
            if(existeArtista(artista)){
                if(position % 2 == 0){
                    msnVH.lay.setBackgroundColor(Color.rgb(200, 200, 200)); //Cinza Claro.
                }
                msnVH.txtInfMenRemetente.setText(mensagem.getMenRemetente());
                msnVH.txtInfMenAssunto.setText(mensagem.getMenTitulo());
                msnVH.txtInfMenDataHora.setText(globais.formataData(mensagem.getMenData()) + " - " +
                        globais.formataHora(mensagem.getMenHora()));
                msnVH.txtInfMenLida.setText(mensagem.getMenLida() == 0 ? "Não":"Sim");
            }
           
            return view;
        }
       
        private boolean naoExisteView(View view) {
            return view == null;
        }

        private boolean existeMensagens(Mensagem mensagem) {
            return mensagem != null;
        }
    }
   
    static class MensagensViewHolder{
        LinearLayout lay;
        TextView txtInfMenTiRemetente, txtInfMenRemetente, txtInfMenTiAssunto, txtInfMenAssunto,
                     txtInfMenTiDataHora, txtInfMenDataHora, txtInfMenTiLida, txtInfMenLida;
    }

_________________
Inux Sistemas: http://www.inux.com.br
Inux Sistemas FaceBook: http://www.facebook.com/pages/Inux-Sist ... 1175085481
E-mail: contato@inux.com.br
Skype: garekx
E-mail pessoal: victor_apc@yahoo.com.br

Calculadora IMC: https://play.google.com/store/apps/deta ... 3JhaW1jIl0.

Gerador e Validador de CPF e CNPJ: https://play.google.com/store/apps/deta ... f&hl=pt_BR

Desenvolvimento de aplicativos e Sistemas Android, Web e sistemas Desktops.


21 Nov 2012, 10:05
Perfil WWW
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Olá Victor
Como a View está sendo reutilizada, é necessário colocar um else no if abaixo e setar a cor default.

                if(position % 2 == 0){
                    msnVH.lay.setBackgroundColor(Color.rgb(200, 200, 200)); //Cinza Claro.
                }

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


21 Nov 2012, 21:12
Perfil
Widgets
Widgets

Data de registro: 13 Abr 2011, 18:37
Mensagens: 383
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
A H Gusukuma, deu certíssimo. Vc é meu herói rsrs.

Realmente ficou bem melhor agora, ta mais rápido. Obrigado a todos, ótimo tutorial.

_________________
Inux Sistemas: http://www.inux.com.br
Inux Sistemas FaceBook: http://www.facebook.com/pages/Inux-Sist ... 1175085481
E-mail: contato@inux.com.br
Skype: garekx
E-mail pessoal: victor_apc@yahoo.com.br

Calculadora IMC: https://play.google.com/store/apps/deta ... 3JhaW1jIl0.

Gerador e Validador de CPF e CNPJ: https://play.google.com/store/apps/deta ... f&hl=pt_BR

Desenvolvimento de aplicativos e Sistemas Android, Web e sistemas Desktops.


21 Nov 2012, 22:33
Perfil WWW
Application Life Cycle
Application Life Cycle
Avatar de usuário

Data de registro: 10 Jan 2012, 12:28
Mensagens: 245
Localização: Belo Horizonte, MG
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Texto retirado pelo autor

_________________
Daniel Tibúrcio
Ideia Informática Ltda.
http://www.ideiainformatica.com.br
Meu aplicativo
https://play.google.com/store/apps/details?id=br.ideiainformatica.idepagprof
(31)3291-9799
Skype ideia_daniel
"O Senhor é o meu Pastor, nada me faltará" Salmo 23:1


Editado pela última vez por Daniel Tibúrcio em 15 Abr 2013, 18:35, num total de 1 vezes



13 Abr 2013, 16:52
Perfil WWW
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Daniel Tibúrcio escreveu:
Executei este processo mas a ListView não foi preenchida.
Coloquei comandos de Log na view GetView mas nada foi mostrado, teria que ser assim mesmo?
Minha situação é a seguinte, como é do Gusukuma: recebo um ArrayList da minha Activity principal, então movo os dados dela para o ArrayList e continuo o processo.

Se quiser ver onde errei:


Olá,
O erro foi copiar um exemplo que está com um bug!

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


15 Abr 2013, 10:11
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
raphaelframos escreveu:
Que bom que te ajudou victor!
Gusukuma eu mudei o LayoutInflater, em relação ao BaseAdapter, fiquei em duvida, eu uso o ArrayAdapter, pq eu geralmente pagino o listview, então uso o adaptador.add e adaptador.clear, e com baseAdapter não encontrei uma solução. A diferença no desepenho é grande mesmo? Vlw


Olá, Raphael

Não sei se desde o início estava assim ou se ficou assim após a alteração, mas dá uma verificada no Adapter, tem um bug no getView.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


15 Abr 2013, 10:14
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Tuto ok!
Obrigado

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


15 Abr 2013, 13:08
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Erro noob... foi feito quando apareceu um problema em uma lista com checkbox, aquele velho problema de atualizar o item. Só posso ter feito isso sem usar compilador... não é possível :D Vlw pelo toque Gusukuma.

_________________
Powell


15 Abr 2013, 13:11
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Otimizando um adapter listView com padrão ViewHolder
Um video com exemplos e explicação disso... http://debugcodigos.blogspot.com.br/201 ... droid.html
Obs: Não sou eu no vídeo :D Só um complemento :D

_________________
Powell


31 Ago 2013, 19:15
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 29 Mensagens ] 

Quem está online

Usuários vendo este fórum: adenilsonsena, Aderbal Nunes, Alexandre de Queiroz, alexcost2002, alexmarcolongo, alexsander.miranda, alylson, amarildolacerdas, amos, Andreid, antoniodourado, Arthas, attomweb, bernardodauer, Biel, blurkness, Bravox, brenno, brunogh, BrunoO, Bruto_JPO, camilodev, cassiano, cassianotartari, cehills, cenatech, Cr-Informática, cyzko, Darth Plagueis, dchechetto, deivisonrpg, difrene, dirceuconte, dkclan, Dorpho, dreyer, Dudi_FC, elisa, Erik Patekoski, estratec, euguns, Everton Moreira, felipedornelas, fernandofsf, fgalvão, Flavio, flaviohssantos, furlanrapha, gamito, geco, Guilherme Cobain, gustavobarbosa, guto.pro, HanNiBaLSeTDf, henrikesilva1, henrique.garcia, Heritrix, hugomarinho, Igor_M, IgorBrum, ismavolk, j-menezes, jacard, Jango Fett, jasn, jaydson, jcdeveloper, jcorreajr, jhhm_2008, jonasminas, juliana_costa, Julio Assis, juniorfranca, Knut, leeeeooooooo, Lelinho, Liviosousa, lucasB, lucasmadeira, lucianno, luciocamilo, luiz.lago, Mace Windu, maiconjunches, malucouto, marceloaragao, marcosf63, Marini, Marlosm, marlovich, Marlus Dias Silva, mcroft, mlemos, Mvitor, nardosnt, neosun, Nute Gunray, pamonteiro, Patrick, Paulo Bizzo, phfmendes, phpower1, piantino, PicsearchDroid, pomarolli, Qui-Gon Jinn, R2-D2, rafaelmonoh, rafsantos, rbenatti, rlecheta, Robson Florentino, rodrigo_corinthians, romulotales, silvio.carlos, snonca, srmoreira, tChAnDy, Thelemita, thosjanas, ton.soares, tonholis, vicfalmac, W3 [Sitesearch], wagner_francisco, Wesleyceraso, xikin, Yoda, zaquiel, zeantonio e 3 visitantes


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi