Search code examples
backgroundresizeandroid-arrayadapterandroid-listfragmentalternate

Alternate background for rows in a ListFragment not working when resizing the rows


I'm using a custom ListFragment to display a list in which even rows have a background and odd rows don't. To do this I made a subclass of ArrayAdapter with an overriden getView(int, View, ViewGroup) method and set the background resource for the even rows there.

It worked, but I needed to adjust the dimensions of the views to be equal in the rows with and without background, so I adjusted the LayoutParams as follows:

@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;
}

I tried this, and it seemed to work until I scrolled down and then up, which resulted in the background being applied to every row.

My question is: what am I doing wrong?

I'm using the v4 support library for the fragments, and this is the onCreate(Bundle) method of my custom ListFragment:

@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));
}

Solution

  • The View used to make up the list are reused once they aren't visible on the screen.

    In your original code, once the background was set to R.drawable.marcador_wink_normal on a given View, it was R.drawable.marcador_wink_normal forever. When you added the else, you made it set the background correctly on these reused Views.