
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():
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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.