O ignorado parâmetro convertView do BaseAdapter

by Hiroshige Kagawa / from beautifuldecay.com

Quando vamos criar um adapter customizado para uma ListView, normalmente criamos uma classes que herdam de BaseAdapter e nos deparamos com o método getView():


public View getView(int position, View convertView, ViewGroup parent) {
return null;
}

O primeiro parâmetro desse método é obviamente a posição do item na lista e o terceiro é o pai de nossas views que serão criada, ou seja, o proprio ListView. Mas e o segundo parâmetro? É muito comum ver ele sendo completamente ignorado como no código abaixo:


@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.child, parent);
TextView textView = (TextView) view.findViewById(R.id.textView);
Object object = getItem(position);
textView.setText(object.toString());
return view;
}

Pra quê serve o parâmetro convertView? No código acima, para cada item de nossa lista o layout “R.layout.child” é inflado em um objeto View e dependendo do número de elementos que teremos em um nossa lista isso pode quebrar o “smooth” de nossa ListView, ou seja, a fluidez com que se carregam os elementos conforme o scrolling da lista. Dependendo do número de elementos, ficar inflando layouts pode criar um processamento pesado na UI Thread e tornar nossos aplicativos menos fluidos. O parâmetro convertView vem justamente para solucionar isso através da reutilização de objetos View. Uma vez que esse parâmetro recebe uma instância de View, ele se repercute ao longo das chamadas do método getView(). Então, inflamos o nosso layout uma única vez e reaproveitamos ele nas chamadas seguintes como mostrado no código abaixo:


@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.child, parent);
}
TextView textView = (TextView) convertView.findViewById(R.id.textView);
Object object = getItem(position);
convertView.setText(object.toString());
return convertView;
}

Uma vez que esse objeto aponta para uma instância da classe View, ele não precisa mais ser reinstanciado ou layouts serem inflados para serem retornados ao final do método. Isso elimina um processamento que pode acabar influênciando a interação com o usuário e trazendo más experiências ao nosso usuário.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s