ListView dando "travadinhas"

Tenho uma ListView aqui que é preenchida no onCreate a partir de um WebService. Até ai tudo bem.

Os itens desta ListView contem imagens… Talvez por isso, quando movimento esta lista ela da pequenas “travadinhas” como se ainda estivesse carregando.

Esse problema persiste, mesmo passando por toda a lista, que teoricamente carregaria todos os dados ela continua com este problema.

Acho que não é problema de memória por que estou testando em um tablet com bom processador. O que pode ser?

Posso estar enganado,

é uma impressão que tenho, e no debug já vi isso acontecer.

sempre que você uso o Scroll para cima ou para baixo, o Android reconstrói as views que estão sendo exibidas, esse pode ser o motivo por continuar lento,

se quiser testar implemente um onItemClicklistener, mude a cor da view que foi clicada desça e suba o scroll.

[quote=dionefc]Posso estar enganado,

é uma impressão que tenho, e no debug já vi isso acontecer.

sempre que você uso o Scroll para cima ou para baixo, o Android reconstrói as views que estão sendo exibidas, esse pode ser o motivo por continuar lento,

se quiser testar implemente um onItemClicklistener, mude a cor da view que foi clicada desça e suba o scroll.

[/quote]

Cara, bem observado.
Tambem tinha percebido isso, por exemplo, no debug percebi que as views que estão escondidas na lista quando a lista é criada só são construidas quando você move a lista para a posição destas views. Não sei se deu para entender muito bem…

Alguma idéia para evitar isso?

No seu adapter você tem que testar se aquela View ja foi criada antes de inflar…
exemplo…

View tela 2 = convertView;  
  
if (tela2 == null) {  
        LayoutInflater inflater = (LayoutInflater) context    
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
        tela2 = inflater.inflate(R.layout.tela2, parent, false);    
}  

[quote=jonathan Coelho]No seu adapter você tem que testar se aquela View ja foi criada antes de inflar…
exemplo…

View tela 2 = convertView;  
  
if (tela2 == null) {  
        LayoutInflater inflater = (LayoutInflater) context    
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
        tela2 = inflater.inflate(R.layout.tela2, parent, false);    
}  

[/quote]

Opa, testando aqui…

Jonathan, a lentidão resolveu cara, mas agora ta dando alguns erros de duplicidade de views…

Fiz assim…

[code]public View getView(int position, View convertView, ViewGroup parent) {

			Usuario usuario = ListaDeUsuarios.get(position);
		
			View tela2 = convertView;    
		    
			if (tela2 == null) {   
			View view = BuscarOn.this.getLayoutInflater().inflate(
					R.layout.item, null);
			if (!(usuario.getFotoPerfil().equals(""))) {
				System.gc();
				byte[] imagemEmBytes = Base64.decode(usuario
						.getFotoPerfil());

				ImageView fotoPerfil = (ImageView) view
						.findViewById(R.id.itemFotoPerfil);
				Bitmap bm = Bitmap.createScaledBitmap(BitmapFactory
						.decodeByteArray(imagemEmBytes, 0,
								imagemEmBytes.length), 150, 150, false);
				fotoPerfil.setImageBitmap(bm);

				bm = null;
			}

			

			return view;
			} else
				return tela2;
			
		}[/code]

Se voce carregar as imagens sincronas ele vai travar a cada create para carregar a imagem.

Cara não entendi o que voce quiz dizer.

Carregar imagens não é uma tarefa instantanea, se voce faz um BitmapFactory.decode (ou um getResources().getDrawable) a thread ira esperar esse processamento terminar para continuar.

Se voce carregar isso assincrono o resultado será uma lista escrolando sem “travadinhas”.

[quote=Marky.Vasconcelos]Carregar imagens não é uma tarefa instantanea, se voce faz um BitmapFactory.decode (ou um getResources().getDrawable) a thread ira esperar esse processamento terminar para continuar.

Se voce carregar isso assincrono o resultado será uma lista escrolando sem “travadinhas”.[/quote]

Opa cara, maravilha, agora entendi… Consegui resolver usando o exemplo da propria API. Pra quem tiver o mesmo problema…

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

Obrigado a todos.

A dica que Marky deu também é válida!!!

Se eu fosse você criaria ou uma ‘new Thread’ ou um ‘AsyncTask’. Ia otimizar ainda mais sua ListView.

:slight_smile:

PS: Não fique criando Threads, use um Executor e vá executando AsyncTasks.