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));
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top