O plano de fundo alternativo para linhas em um ListFragment não funciona ao redimensionar as linhas
-
11-12-2019 - |
Pergunta
Estou usando um ListFragment personalizado para exibir uma lista na qual as linhas pares têm plano de fundo e as linhas ímpares não.Para fazer isso, criei uma subclasse de ArrayAdapter com um método getView(int, View, ViewGroup) substituído e configurei o recurso de plano de fundo para as linhas pares.
Funcionou, mas precisei ajustar as dimensões das views para ficarem iguais nas linhas com e sem fundo, então ajustei o LayoutParams da seguinte forma:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if ((position & 1) == 0) {
view.setBackgroundResource(R.drawable.marcador_wink_normal);
}
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = rowHeight;
view.setLayoutParams(params);
return view;
}
Eu tentei isso e pareceu funcionar até rolar para baixo e depois para cima, o que resultou na aplicação do plano de fundo a todas as linhas.
Minha pergunta é:O que estou fazendo de errado?
Estou usando a biblioteca de suporte v4 para os fragmentos, e este é o método onCreate(Bundle) do meu ListFragment personalizado:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;
setListAdapter(new WinkAdapter(getActivity(), layout, TEST_LIST));
}
Solução
As Views utilizadas para compor a lista são reaproveitadas quando não estiverem visíveis na tela.
No seu código original, uma vez definido o background como R.drawable.marcador_wink_normal em uma determinada View, ele era R.drawable.marcador_wink_normal para sempre.Ao adicionar o else, você definiu o plano de fundo corretamente nessas visualizações reutilizadas.
Outras dicas
Ok, resolvi apenas adicionando um outro declaração:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if ((position & 1) == 0) {
view.setBackgroundResource(R.drawable.marcador_wink_normal);
}
else {
view.setBackgroundColor(0);
}
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 100;
view.setLayoutParams(params);
return view;
}
Mas ainda não entendo por que o problema aconteceu.