Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

lentidão para inflar a lista

ola, estou fazendo o codigo como o da aula, meu app estava rodando liso até esta aula, quando adicionei a lista com foto, nome e telefone a aplicação ficou extremamente lenta para carregar a lista, depois de construir o adapter para lista e inflar o novo xml a operação ficou muito lenta, isso é normal? como poderia corrigir isso?

6 respostas

Andrey, tudo bem ?

Este é um problema bem comum do desenvolvedor, dá uma olhadinha nesse post que escrevi aqui pro blog :

http://blog.alura.com.br/utilizando-o-padrao-viewholder/

Qualquer dúvida estou a disposição

Abraços :D

opa, tudo bom.

legal essa ideia de isolar os fvbi no ViewHolder, fiz aqui mas não resolveu o problema da lentidão, o app roda todas as activities normalmente, liso, inclusive carreganto foto, mas a lista contendo dois text views e uma imageView por item da lista continua lenta para carregar, ta demorando cerca de 10s para carregar a activity da lista enquanto fica tudo travado, (estou rodando direto no celular).

agradeço a ajuda.

public class AlunosAdapter extends BaseAdapter { private final List alunos; private final Context context; private ViewHolder holder;

public AlunosAdapter(Context context, List alunos) { this.context = context; this.alunos = alunos; }

@Override public int getCount() { return alunos.size(); }

@Override public Object getItem(int position) { return alunos.get(position); }

@Override public long getItemId(int position) { return alunos.get(position).getId(); }

@Override public View getView(int position, View convertView, ViewGroup parent) { Aluno aluno = alunos.get(position); LayoutInflater inflater = LayoutInflater.from(context); View view; if(convertView == null) { view = inflater.inflate(R.layout.list_item, parent, false); holder = new ViewHolder(view); view.setTag(holder); }else{ view = convertView; holder = (ViewHolder) view.getTag(); }

holder.campoNome.setText(aluno.getNome());

holder.campoTelefone.setText(aluno.getTelefone());

String caminhoFoto=aluno.getCaminhoFoto();

if(caminhoFoto!=null) { Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto); Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 100, 100, true); holder.campoFoto.setImageBitmap(bitmapReduzido); holder.campoFoto.setScaleType(ImageView.ScaleType.FIT_XY); }

return view; } }

public class ViewHolder { public TextView campoNome; public TextView campoTelefone; public ImageView campoFoto;

public ViewHolder(View view){ campoNome = (TextView) view.findViewById(R.id.list_nome); campoTelefone = (TextView)view.findViewById(R.id.list_telefone);

campoFoto = (ImageView) view.findViewById(R.id.list_foto); } }

solução!

Andrey, o grande problema é que toda vez ele está pegando um arquivo bem grande e convertendo ele para um arquivo menor, o que gera um bom processamento.

Matheus, entendi o problema... realmente esta lento por causa do createScaledBitmap , para tentar resolver isso eu salvei um Bitmap bitmap Reduzido na classe aluno e faço um getBitmapReduzido quando quero abrir a imagem e ja pego o Bitmap reduzido salvo na classe Aluno, o problema que quando faço isso ele não carrega a foto na lista, os itens da lista que tem foto ficam em branco. não tenho certeza se o que eu fiz seria o mais correto, teria alguma ideia?

ja agradeço pela ajuda, obrigado o/

matutando aqui, descobri que ele não carrega a imagem porque ele cria o aluno da lista a partir do alunoDAO e eu nao tenho o bitmapReduzido no banco de dados, então minha pergunta é: como faço para salvar imagens que podem ser carregadas em ImageView no banco de dados usado no curso?(SQLite), acredito que se eu conseguir salvar a propria imagem no banco ao invés do caminho dela no meu dispositivo seja muito mais interessante e usual.

Vc podia salvar 2 imagens.. a reduzida e a normal e colocar 2 colunas de foto no teu DB, foto normal e foto reduzida... Ai na lista vc carrega a Reduzida e no perfil vc carrega a normal.. Eu tive esse mesmo problema, não demorava 10 segundos, mas tinha um bom delay, fiz aqui desse jeito e ficou filé. Só não sei em questão de armazenamento em disco quanto isso iria custar para aplicação. Mas resolve o problema de cara.