Ver mensagens sem resposta | Ver tópicos ativos Hoje é 21 Nov 2017, 16:37



Responder Tópico  [ 1 Mensagem ] 
 ListView infinito 
Autor Mensagem
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem ListView infinito
Tive que paginar as listas da minha aplicação e sofri muito com listas com milhares de itens até encontrar esse tutorial. Cada um pode adaptar para sua necessidade, mas a essencia sempre vai ser essa:

No exemplo é mostrado um quantidade infinita de datas, limitadas por uma quantidade pré-definida para aparecer na tela, não sobrecarregando a aplicação.
package br.com.powell.tutorial.paginandolistview;

import java.util.ArrayList;
import java.util.Calendar;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;

public class PaginaListView extends ListActivity {
   
    private int itensPorPagina = 20;
    private boolean carregandoMaisItens = false;
    private ArrayList<String> listaComItens = new ArrayList<String>();
    private ArrayAdapter<String> adapter;
    private Calendar data = Calendar.getInstance();
   
    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listplaceholder);

 //Rodapé mostrando o carregando de mais itens
        criaRodapeDeMaisItens();
        criaAdaptador();
       
        this.getListView().setOnScrollListener(new OnScrollListener(){
           
       
            public void onScrollStateChanged(AbsListView view, int scrollState) {}
           
       
            public void onScroll(AbsListView view, int primeiroItem,
                    int itensNaTela, int totalDeItens) {
               
                int ultimoItemNatela = primeiroItem + itensNaTela;             
 //Define quando se deve carregar novos itens
                if((ultimoItemNatela == totalDeItens) && !(carregandoMaisItens)){                  
                    iniciaNovaThread();
                }
            }

        });
       
        iniciaNovaThread();
   
    }


    private void iniciaNovaThread() {
        Thread thread =  new Thread(null, carregaNovosItensNaLista);
        thread.start();
    }
   
    private void criaAdaptador() {
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listaComItens);
        this.setListAdapter(adapter);
    }


    private void criaRodapeDeMaisItens() {
        View footerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listfooter, null, false);
        this.getListView().addFooterView(footerView);
    }
   
    private Runnable carregaNovosItensNaLista = new Runnable() {       
       
        public void run() {
            //seta flag de carregamento de produtos
            carregandoMaisItens = true;
           
            listaComItens = new ArrayList<String>();
           
            //Tempo de carregamento
            try { Thread.sleep(1000);
            } catch (InterruptedException e) {}
           
            for (int i = 0; i < itensPorPagina; i++) {     
                adicionaNovaData();
            }
           
            runOnUiThread(returnResultado);
           
        }

        private void adicionaNovaData() {
            listaComItens.add("Data: " + (data.get(Calendar.MONTH)+ 1) + "/" + data.get(Calendar.DATE) + "/" + data.get(Calendar.YEAR) );           
            data.add(Calendar.DATE, 1);
        }
    }
   

    private Runnable returnResultado = new Runnable() {
       
        public void run() {
           
            //Adiciona no adaptador os novos itens
            if(listaComItens != null && listaComItens.size() > 0){
                for(int i=0;i<listaComItens.size();i++)
                    adapter.add(listaComItens.get(i));
            }
           
            //Atualiza titulo do app
            setTitle("Lista com " + String.valueOf(adapter.getCount()) + " itens");
           
            //Atualiza lista
            adapter.notifyDataSetChanged();
           
            //Seta flag de carregamento de novos itens
            carregandoMaisItens = false;
        }
    };
 


Rodapé: listfooter.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:gravity="center_horizontal"
    android:padding="3dp"
    android:layout_height="fill_parent">
   
   
    <TextView
        android:id="@id/android:empty"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:padding="5dp"
        android:text="Carregando mais datas..."/>


</LinearLayout>


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

    <ListView
        android:id="@id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:fastScrollEnabled="true"
        android:drawSelectorOnTop="false" />


    <TextView
        android:id="@id/android:empty"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:text="Carregando data.."/>


</LinearLayout>


Me ajudou bastante, espero que gostem. Vlw!

_________________
Powell


22 Nov 2012, 23:25
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 1 Mensagem ] 

Quem está online

Usuários vendo este fórum: (_FM_), ac0502, aechiara, Alessandro Tavares, alex.abrantes, alexmarcolongo, Alexsandro Tirloni, Anakin Skywalker, andrewort, Beru Lars, Biel, Blackstorm, Bravox, Bruno, btleandro, canaville, Captain Typho, careisjr, Carlos, Carlos Almeida, Catapan, cavenaghi, Chaves, Christiane, chunga, claudioalfonso, Costa, czambroni, dalmeidabr, Damiani Oliveira, danilosv, Darth Sidious, dbispo, Deiapinh, denisfln, dentimskol, Dirceu W. C. Conte, dobau, EduardoYC, Eliezer Reis, Emanuella, emersonalencar, erosvaldo, euguns, eXagon, ffardo, flaviocc, francismarconcini, gabrielatme, gabrielpg, Gooooogle, Guilherme, guilhermepilotti, guilhermesmo, gustavo, HanNiBaLSeTDf, hbarroco, hebert, hellbest, henrikesilva1, ice, Ielo8, IgorBrum, ismaelbpaiva, Jenius, jlucasps, johnnyjx, João Miguel Aguiar, juliancesar, Katia, kecyobarros, kleberperea, konos, laucode, laurj, Legiao, Lelinho, leosl81, LForce, lhdiassilva, lisbao, lkunta, loferreira, lucastgomes, lucianoedipo, Lucious, luizcarlosvb, m4v0, MARCIOHG, martins, mateusff, Mayara Trevisol, Mayron Cimardi, Meticore, mlemos, mmfsndroid, mmiottobarbosa, Moisés Souto, MSPRAFAEL, navegador, NeruLL, nfaria, o-raposa, onaiggac, otium, Paulo Bizzo, pererinha, Philipe Alves, poponeis, Portal Android, pumadeejay, rafael.cioban, rafaelvital, rcotonet, rdchaves, reginaldo, ricdigital, Robson Florentino, rogerio.alcantara, romuloff, rosano, Rufino, sasuke_sarutobi, scattonevi, SEO Crawler, SidneiCP, silvio.carlos, talves, tChAnDy, thanaptos, thienne, tiagoxv, tnarnold, vaniuz, viniciusgoncalves, wagner_francisco, Webnet, Wenceslau, Zam Wesell, zenden1503 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